
因为这个函数的形式比较特殊,对其两边取对数后得到
log(y)=log(a)+blog(x1)+clog(x2)
于是立即就转换为了线性拟合
[1 log(x1) log(x2)][log(a) b c]'=log(y)
于是[log(a) b c]'=[1 log(x1) log(x2)]\log(y)
这样就可以得到a,b,c了。不需要进行非线性拟合。
下面是程序:(对于x1、x2、y的赋值部分这里就不写了,你自己在前面加上即可)
p=[ones(length(y),1) log([x1 x2])]\log(y);%就这一句话就搞定了
a=exp(p(1)),b=p(2),c=p(3)%这就是拟合后的参数值
y%这是采样点y的值
ax1^bx2^c%这是拟合后在采样点得到的值,可以和y比较一下,很接近。
题主的(4自变量1因变量)多元函数的拟合matlab程序。可以用nlinfit非线性回归函数来做(也可以用lsqcurvefit函数)。实现代码:
x1=[055 065 065 065 065 055 055 055 065]';
x2=[16 16 14 16 14 14 16 14 14]';
x3=[20 20 20 10 10 20 20 20 20]';
x4=[10 10 10 10 10 10 12 12 12]';
Y=[1848 3145 3337 3022 3188 197 163 1621 2534]';
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= -152778571412534;a2= 114823809522886;a3= -0359047619087202 ;a4= 000441190476147387;a5=-023363095238449
多元函数表达式,y=a1+a2x1+a3x2+a4x3+a5x4
nlinfit与lsqcurvefit两者区别并不太大,前者用回归的方法来求解,而后者用最小二乘法来求解,两者都可以用于非线性函数和线性函数。
使用griddata函数,可进行三维拟合,并求出任意点处的值,之前用过求电流温度和电阻率的函数拟合如下rq=griddata(i,t,r,iq,tq) 。
具体过程如下:
D=[[1,6,92];[4,12,15];[7,4,23];[10,10,25];[13,2,11];[16,8,9];[0,0,3861]]
D =
10000 60000 92000
40000 120000 15000
70000 40000 23000
100000 100000 25000
130000 20000 110000
160000 80000 90000
0 0 3861000
x=D(:,1);y=D(:,2);
z=D(:,3);
T=[x y xy xx yy ones(7,1)]\z
T =-307039
-875047
29042
06209
44429
3861000
所以所求函数为 T(1)x+T(2)y+T(3)xy+T(4)x^2+T(5)y^2+T(6)
即z=-307039x--875047y+29042xy+06209x^2+ 44429y^2+3861000
1、首先启动matlab,选择编辑器,再新建一个命令文件。
2、然后在编辑器窗口中输入图示的代码。
3、然后我们点击界面上方菜单栏里的保存图标进行保存。
4、需要注意的是,保存文件的位置要与当前搜索路径的位置保持一致。这可以通过右键编辑窗口的文件,在d出的下拉框中选择。
5、最后再命令行窗口处输入dxsnh,并敲入键盘上的enter建。可以看出阶数越高,曲线与拟合点拟合得越好。
扩展资料:
函数中所使用的算法都是科研和工程计算中的最新研究成果,而且经过了各种优化和容错处理。在通常情况下,可以用它来代替底层编程语言,如C和C++ 。在计算要求相同的情况下,使用MATLAB的编程工作量会大大减少。
MATLAB的这些函数集包括从最简单最基本的函数到诸如矩阵,特征向量、快速傅立叶变换的复杂函数。
函数所能解决的问题其大致包括矩阵运算和线性方程组的求解、微分方程及偏微分方程的组的求解、符号运算、傅立叶变换和数据的统计分析、工程中的优化问题、稀疏矩阵运算、复数的各种运算、三角函数和其他初等数学运算、多维数组 *** 作以及建模动态仿真等。
用matlab cftool工具箱选择ploynomial进行拟合,拟合效果(看似很好)并不一定符合你要求。你可以用得到的拟合函数,来验证(yi=f(xi))是否与已知数据(y值)基本相吻合。
一般我们的拟合函数,可以用下列方法来进行。
fun=@(a,x)a(1)x(1)+a(2)x(2)+。。。 %自定义函数
[a,resnorm,residual,exitflag]=lsqcurvefit(fun,x0,X,y); %x0——初值,X=[x y];
或
[a,r,J] = nlinfit(X,y,fun,x0);
求得拟合函数后,绘制图形
xa=[。。。], ya=[。。。];
[x,y]=meshgrid(xa,ya);
z=f(x,y);
mesh(x,y,z)
xlabel('x');ylabel('y');zlabel('z');
如有还问题,可以再帮你。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)