题主的(缓码4自变量1因变量)多元函数的拟合matlab程序。可以用nlinfit非线性回归函数来做段察(也可以用lsqcurvefit函数)。实现代码:
x1=[0.55 0.65 0.65 0.65 0.65 0.55 0.55 0.55 0.65]'
x2=[1.6 1.6 1.4 1.6 1.4 1.4 1.6 1.4 1.4]'
x3=[20 20 20 10 10 20 20 20 20]'
x4=[10 10 10 10 10 10 12 12 12]'
Y=[1.848 3.145 3.337 3.022 3.188 1.97 1.63 1.621 2.534]'
X=[x1 x2 x3 x4]
n=length(x1)
a0=rand(1,5)
func=@(a,X)(a(1)+a(2)*X(:,1)+a(3)*X(:,2)+a(4)*X(:,3)+a(5)*X(:,4))
[a,r,J] = nlinfit(X,Y,func,a0)a
Y1=func(a,X)
[Y Y1]
运行上述代码,可以得到
a1= -1.52778571412534;a2= 11.4823809522886;a3= -0.359047619087202 ;a4= 0.00441190476147387;a5=-0.23363095238449
多元函数表达式,y=a1+a2*x1+a3*x2+a4*x3+a5*x4
nlinfit与lsqcurvefit两者区别并不扰燃哪太大,前者用回归的方法来求解,而后者用最小二乘法来求解,两者都可以用于非线性函数和线性函数。
看你的描述,我认为你问题其实是解过约辩冲陆束(判兄或缺约束)携顷的线性方程组。假如仅有你提供的5组(4ad+1err)数据,程序如下:
ad1=[1000 610 251 81 32]'
ad2=[479 1000 731 325 35]'
ad3=[29 315 741 1000 520]'
ad4=[24 29 259 761 1000]'
e=ones(size(ad1))
err=[13 6.5 0 -6.5 13]
ad=[ad1 ad2 ad3 ad4 e]'
format long
a=inv(ad)*err
a =
-0.02485337007149
-0.01063082921545
-0.03706276144467
-0.01084050669214
44.28052950819872
也就是说有
-0.02485337007149*ad1
-0.01063082921545*ad2
-0.03706276144467*ad3
-0.01084050669214*ad4
+44.28052950819872
=err
可以做到!!关于参数问题 help之我一般喜欢使用nlinfit
非线性拟合,我用过很多次发现要用好她
的关键在于你要找到一个很好的初值
举个例子:
椭圆的方程可以是
ax^2+by^2+cxy+dx+ey+f=0
发现其实双曲线,抛物线和他的一样
所以你在选取初值的时候最起码初值租握带入后
是个椭圆,
不然你拟合出来不仅仅是效果差,可能就变质
你说的情况其实是解方程了(四个未知数四个方程)
对于更多的数据:
先编写函数
function f=ffun(a,x)
f=a(1)*x(:,1)+a(2)*x(:,1).^2+a(3)*x(:,2)+a(4)*x(:,2).^2
其余运行
x=[p,c]%p,c为列响量,f也为列向缓庆量
a0=[1,1,1,1]%初值扰型握取好点效果更好
a=nlinfit(x,f,'ffun',a0)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)