matlab 非线性拟合问题

供稿:hz-xin.com     日期:2025-01-18
Matlab非线性多元拟合nlinfit函数出问题

拟合函数的输入有两个参数,
第一个应该是你要拟合的参数,对应于这里a
第二个是输入的自变量,对应于这里的x
多维的可以用多列数据,注意行数和y相同

还要注意,函数式里向量间的*,\,^,要用.*,.\,.^

x=[1,1;2,2;-1,-2;0,-1;3,6];
y=[10;23;-8;-3;19];
a=[0.5 0.5 0.5 0.5 0.5];
f=@(a,x)a(1)+a(2)*x(:,1)+a(3)*x(:,2)+a(4)*x(:,1).*x(:,2)+a(5)*x(:,1).^2;
nlinfit(x,y,f,[0.5 0.5 0.5 0.5 0.5])

首先将y和x1,x2,x3都变为列向量,就是80x1的矩阵
如果原来是行向量1x80的矩阵用y=y.'或x1=x1.‘转置一下就可以了
将x1 x2 x3合拼为80x3的矩阵
x=[x1 x2 x3];

然后创建函数句柄
fun=@(a,x) a(1)*x(:,1)+a(2)*x(:,2)+(a(3)*x(:,1)+a(4)*x(:,1)).*(1+exp(a(5)+a(6)*x(:,3)));
其中a1=a(1),a2=a(2),b1=a(3),b2=a(4),c=a(5),d=a(6);

a0=[* * * * * *]; %这里要为6个参数赋予一个初值
aa=nlinfit(x,y,fun,a0); %调用nlinfit进行拟合,得到的aa是6个值的向量,对应原来的6个参数


这里关键是初值的选择,如果初值和结果很接近,那么拟合很快收敛
如果初值选择不恰当,可能计算收敛慢,甚至不收敛,得不到结过

x=[30 60 90 120 150]';

Q=[446.86  765.49  879.81 759.01  434.15]';

ft_=fittype('A*sin((x+a)*pi/180)+B','dependent',{'Q'},'independent',{'x'},'coefficients',{'A','a','B'});

ff=fit(x,Q,ft_)

plot(x,Q,'b*');

hold on;

x=-30:390;

Q1=ff(x);

plot(x,Q1);

hold on;

结果

ff =

     General model:

       ff(x) = A*sin((x+a)*pi/180)+B

     Coefficients (with 95% confidence bounds):

       A =       878.8  (875.2, 882.4)

       a =      0.4644  (0.3879, 0.541)

       B =       1.134  (-1.642, 3.911)



>> x=[pi/6,pi/3 pi/2 2*pi/3 5*pi/6];
>> Q=[446.86 765.49 879.81 759.01 434.15];
>> f=@(p,x)p(1)*sin(x+p(2))+p(3);
>> p=nlinfit(x,Q,f,[100,10,200])%用nlinfit非线性拟合

%p = -878.8079 -15.6999 1.1344
>> x1=0:pi/30:pi;%一下查看拟合效果
>> Q1=p(1).*sin(x1+p(2))+p(3);
>> plot(x,Q,'or',x1,Q1,'b')
%p(1),p(2),p(3)对应参数A,a,B

>> x=[pi/6 pi/3 pi/2 2*pi/3 5*pi/6];
>> Q=[446.86 765.49 879.81 759.01 434.15];
>> g=fittype('A*sin(x+a)+B','independent','x');
>> cfun=fit(x',Q',g)
Warning: Start point not provided, choosing random start point.
> In fit>handlewarn at 698
In fit at 314
Maximum number of function evaluations exceeded. Increasing
MaxFunEvals (in fit options) may allow for a better fit, or
the current equation may not be a good model for the data.

cfun =

General model:
cfun(x) = A*sin(x+a)+B
Coefficients (with 95% confidence bounds):
A = 26.19 (-9201, 9253)
B = 34.39 (-7119, 7188)
a = 18.81 (-97.56, 135.2)

使用cftool

x=[pi/6 pi/3 pi/2 pi*2/3 pi*5/6];
>> Q=[446.86 765.49 879.81 759.01 434.15
];

>> cftool
>>
Linear model:
f(x) = a*(sin(x - pi)) + c
Coefficients (with 95% confidence bounds):
a = -878.8 (-918.8, -838.7)
c = 1.134 (-29.88, 32.15)

Goodness of fit:
SSE: 101.8
R-square: 0.9994
Adjusted R-square: 0.9992
RMSE: 5.825
或者laestsq
建一个函数ken
function f=ken(x)
t=[pi/6 pi/3 pi/2 pi*2/3 pi*5/6];
Q=[446.86 765.49 879.81 759.01 434.15];
f=Q-x(1).*sin(t+x(2))-x(3);

然后输入
x0=[-800,-3,-2];
>> x=leastsq('ken',x0)

x =

-878.8079 -3.1335 1.1344

clear;clc;
A='
k
d
b
a
c';
t=0:17;
x=[26.41
26.94
27.46
27.99
28.51
29.04
30.48
31.91
33.35
34.78
36.22
37.66
39.09
40.53
41.76
42.99
43.90
44.94];
opt=optimset('display','off');
f=@(p,t)(p(1)./(p(2)+p(3)*exp(-p(4)*t))).^(1/p(5));
plot(t,x,'ko');hold
on;
p=fminsearch(@(p)sum((f(p,t)-x).^2),ones(1,5),opt);
cc=corrcoef(t,f(p,t));
disp('estimated
by
fminsearch:');disp(A);disp(p);disp('correlation
coefficient
is:');disp(cc(2));
h=ezplot(@(t)f(p,t),[0,17]);
set(h,'linestyle',':','color','r')
p=lsqcurvefit(f,ones(1,5),t,x,[],[],opt);
cc=corrcoef(t,f(p,t));
disp('estimated
by
lsqcurvefit:');disp(A);disp(p);disp('correlation
coefficient
is:');disp(cc(2));
ezplot(@(t)f(p,t),[0,17]);
legend('original
data','estimated
by
fminsearch','estimated
by
lsqcurvefit','location','southeast')
title('curve
fitting')

关于matlab非线性拟合的问题
在分析数据点时,我们使用了MATLAB进行非线性拟合。数据集包含x和y两个向量,其中x代表一系列递减数值,y则表示与x相对应的数值,这些数值随x的减少而呈现出一定的规律性变化。为了更好地理解这些数值之间的关系,我们对数据进行了可视化处理,通过绘图(plot)功能直观展示了x和y之间的对应关系。在进行非...

matlab 非线性拟合问题
x=[30 60 90 120 150]';Q=[446.86 765.49 879.81 759.01 434.15]';ft_=fittype('A*sin((x+a)*pi\/180)+B','dependent',{'Q'},'independent',{'x'},'coefficients',{'A','a','B'});ff=fit(x,Q,ft_)plot(x,Q,'b*');hold on;x=-30:390;Q1=ff(x);plot(...

matlab 非线性拟合求参数
在进行非线性拟合时,我们首先简化了原始公式,将其分解为便于计算的几个部分。假设公式中的常数项可以作为一个整体参数,我们将其定义为C,这样可以简化后续的计算。我们创建了一个名为shiyan1的m文件,代码如下:在m文件中,我们定义了xdata和ydata两个变量,分别代表自变量和因变量的数据集。然后,我们...

各位大侠,用MATLAB做非线性拟合时,RMSE越小越好,但多大时拟合的效果好...
在使用MATLAB进行非线性拟合时,RMSE(均方根误差)是一个重要的评价指标,反映了模型预测值与实际值之间的差距。通常来说,RMSE越小,模型的预测准确性越高。然而,RMSE的具体数值并没有一个固定的“好”标准值,它依赖于具体的应用场景和数据特性。例如,在气象预测中,RMSE可能需要达到0.5度以下才能...

matlab非线性拟合问题
legend('原始曲线','拟合曲线','Location','southeast')[x,renorm]=nlinfit(xdata,ydata,@curvefun,x0); %确定待定系数 disp('拟合系数')disp(x);realx=real(x);disp('实拟合系数')disp(realx);figure;plot(xdata,ydata)yfit=curvefun(realx,xdata);hold on;plot(xdata,yfit,'r')grid on...

关于matlab非线性拟合的问题?急急!求高手解答
求解方法:>> x=[1,2,3,4,5,6,7];y=[0.0183 0.0043 0.0038 0.0087 0.0211 0.0521 0.1360];>> fun=inline('a(1)*(1+(a(2)^2)*exp(x.*a(3))+cos(x)).*sqrt((1-(a(2)^2))*x).\/x.^2','a','x');>> b=rand(1,3);a=lsqcurvefit(fun...

关于matlab非线性拟合的问题
legend('原始曲线','拟合曲线','Location','southeast')[x,renorm]=nlinfit(xdata,ydata,@curvefun,x0); %确定待定系数 disp('拟合系数')disp(x);realx=real(x);disp('实拟合系数')disp(realx);figure;plot(xdata,ydata)yfit=curvefun(realx,xdata);hold on;plot(xdata,yfit,'r')grid on...

请教matlab非线性拟合结果不唯一的问题
在用matlab的lsqcurvefit( )或nlinfit( )函数进行非线性拟合时,往往不是一次运行就成功的,其结果是不唯一的,其问题在很大程度与初值的选定有较大的关系。可以调整x0的初值,当exitflag=1时(或相关系数R²≈1),说明求解成功。调整x0的初值最有效的方法,就是使用随机函数rand()。

Matlab不确定度验证及非线性拟合的问题
现在这个运行出来每次都不一样,有的离散度只有0.11左右,大部分是0.2左右的;由于生成的y最后基本都等于11多了,所以前几组含显著小于11的数的离散值就偏大,而后面几组基本从头到尾都等于11多,就容易偏小。b=polyfit(x(i,:),y1(i,:),6); %这里拟合的阶数越高,拟合曲线越弯来拐去的...

matlab多元函数非线性拟合问题
程序见下,几点说明:1、你的数据有问题:x1、x2都是13个点,而y是12个点。我暂时按照舍去x最后那个点处理。2、从现在的情况看,效果不好,这和你的数据是否适合所给拟合公式有关。尤其y第5个点感觉比较怪异。3、拟合问题和初值关系很大,如果你能知道拟合参数的大概范围会对尽快得到理想的结果有...