matlab多元函数非线性拟合问题
方法一:
1、最常用的是多项式拟合,采用polyfit函数,在命令窗口输入自变量x和因变量y。
2、以二次多项式拟合为例,输入p=polyfit(x,y,2),如果想拟合更高次的多项式,更换括号内数字即可。
通过计算获得的p,是一个数组,对应了多项式的各项系数,以图中为例,拟合出的多项式为:y=0.9962x2+0.0053x-0.2833。
方法二:
1、首先,在上方工具栏选取APPS,点击curvefitting。输入自变量x和因变量y。
2、选择拟合方式,有多项式拟合polynomial,高斯拟合gaussian,幂指数拟合power等等,本次以多项式拟合为例。
3、通过数据计算,可以获得曲线参数(曲线函数中的各项系数),从而实现曲线拟合。
不论lsqcurvefit还是nlinfit都要说明函数的形式,这两个函数只能在形式确定后估计未知参数的值。
但说白了,既然是拟合,就无所谓函数形式(除非你事先通过理论推测出了函数形式),只要找到拟合最接近的就可以了。你应该先观察一下数据的分布,然后可以假设两种不同的函数形式,分别拟合,然后选取最接近的(即leastsquare error最小的)一个。
1、你的数据有问题:x1、x2都是13个点,而y是12个点。我暂时按照舍去x最后那个点处理。
2、从现在的情况看,效果不好,这和你的数据是否适合所给拟合公式有关。尤其y第5个点感觉比较怪异。
3、拟合问题和初值关系很大,如果你能知道拟合参数的大概范围会对尽快得到理想的结果有帮助。
function zd501259078
x1=[
1.483630594
1.575507174
1.575009825
1.550049815
1.509685848
1.422180961
1.397559392
1.289379364
1.460163938
1.414698256
1.461543476
1.328248649
];
x2=[
0.355159208
0.232657101
0.233320234
0.266600247
0.320418869
0.437092053
0.602440608
0.614160848
0.386448082
0.447068992
0.384608699
0.562335135
];
y=[
1.1725
1.15
1.13425
1.12125
1.05
1.2175
1.24075
1.25075
1.255
1.25675
1.26925
1.2675
];
x0 = [0.47 -0.58 0.93 0.13];
opt = optimset('MaxFunEvals', 1E4, 'MaxIter', 5E4, 'TolFun', 1E-14);
x = lsqcurvefit(@f,x0,[x1 x2],y,[],[],opt);
num2str(x)
a = x(1)
b = x(2)
c = x(3)
d = x(4)
% 绘图比较拟合结果和原始数据
z = a*x1.^b + c*x2.^d;
plot(y, '.-')
hold on
plot(z, 'ro')
function F = f(x, xdata)
a = x(1);
b = x(2);
c = x(3);
d = x(4);
x = xdata(:, 1);y = xdata(:, 2);
F = a*x.^b + c*y.^d;
clc;clear;
x1=[
1.483630594
1.575507174
1.575009825
1.550049815
1.509685848
1.422180961
1.397559392
1.289379364
1.460163938
1.414698256
1.461543476
1.328248649
];
x2=[
0.355159208
0.232657101
0.233320234
0.266600247
0.320418869
0.437092053
0.602440608
0.614160848
0.386448082
0.447068992
0.384608699
0.562335135
];
y=[
1.1725
1.15
1.13425
1.12125
1.05
1.2175
1.24075
1.25075
1.255
1.25675
1.26925
1.2675
];
%x和y大小不一致,我去掉了x最后一个元素
x=[x1 x2];
f=@(A,x)A(1)*x(:,1).^A(2)+A(3)*x(:,2).^A(4);
A=nlinfit(x,y,f,[1.47;-0.2;-0.1;-0.6])%%%方程系数矩阵
如何用matlab进行多元曲线拟合
多元曲线拟合在MATLAB中是一个常见的任务,特别是使用非线性拟合函数nlinfit。我发现使用nlinfit的关键在于寻找合适的初始参数值。比如,椭圆的方程可以表示为ax^2+by^2+cxy+dx+ey+f=0。你会发现,双曲线和抛物线的方程形式与此相同,因此在选取初始值时,至少要确保这些值代入后是一个椭圆,否则拟合...
请教:多元非线性幂函数拟合
1、用表格计算是一件比较繁琐的过程。2、可以借于Matlab的nlinfit()函数,很方便地求出拟合系数a、b、c、d、e。求解步骤:已知数据 x=[0 613.26 613.26 602.38 602.38 930.46]';y=[160 160 185 0210 235 160];z=[16 12 10 9 6 8];x=[x y];y=z;自定义函数 func=@(a,x...
如何判断matlab多元 非线性拟合好坏程度?求高手详细解答
不论lsqcurvefit还是nlinfit都要说明函数的形式,这两个函数只能在形式确定后估计未知参数的值。但说白了,既然是拟合,就无所谓函数形式(除非你事先通过理论推测出了函数形式),只要找到拟合最接近的就可以了。你应该先观察一下数据的分布,然后可以假设两种不同的函数形式,分别拟合,然后选取最接近的(...
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二元函数拟合求参数问题,已知模型求参数
你的问题是多元函数非线性拟合,因为是多元的,所以不太方便使用lsqcurvefit,因为不是多项式,所以不方便使用regress或polyfit。此处,可采用nlinfit,从函数名字直面理解就是nonlinear fit。nlinfit的使用格式是beta = nlinfit(X,y,fun,beta0)此处beta就是你需要拟合得到的系数k1,k2,k3,X是输入变量矩阵...
MATLAB拟合多元非线性函数?
>> x1=[101 98.4 98.8 98.5 98.6 98.2 98.8 99.2 99.5 100.6 101.9 101.5 102.7 102.4 102.8 103.1 102.9 103.3 103.5 103.6 104.4 105.1 104.6 104.9 104.9 105.4 105.3 ...
关于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拟合非线性函数
线性模型、非线性模型是以待优化参数W为参考(而不是看X)。y = w' * x ('表示转置)描述的是线性模型。题目中要拟合的函数是:y = w0 + w1 cos a + ... + wn cosna,它同样符合y = w' * x,其中x = (1 cosa ... cosna)’。设x构成的集合是X,y构成的集合是Y,可依据最小...
matlab的lsqcurvefit函数的九元的非线性拟合不行啊!
2、括号不匹配,多出一个右括号来。改后可以进行拟合,但结果不理想,得到的系数a都是复数,可能的原因:1、上面说到的表达式括号不匹配,我删掉的括号不一定符合你的本意,建议再仔细核对一下;2、曲线拟合的结果在很多情况下和初值有关,考虑试一试别的初值;3、拟合函数的形式是否符合数据的规律?可...
如何用matlab进行已知函数的非线性拟合
首先将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...