24小时热门版块排行榜    

查看: 2973  |  回复: 11

料峭春寒5

新虫 (小有名气)

[求助] matlab多元线性回归拟合求助 已有2人参与

大家好,最近在尝试利用matlab进行多元线性回归拟合,由于是零基础感觉困难重重,请各位高手在百忙之中给予指点,该如何编程呢

T(温度)=[353.15 353.15 353.15 353.15 363.75 363.75 363.75 363.75 373.75 373.75 373.75 373.75 393.75 393.75 393.75 393.75 413.75 413.75 413.75 413.75];
d(密度)=[593.89 636.74 671.27 699.95 533.17 580.38 619.21 651.66 480.53 528.94 570.19 605.34 401.15 445.86 486.70 523.39 347.58 386.61 423.72 458.44];
S=[4.39 4.65 5.24 5.64 4.40 4.67 5.68 5.72 4.85 5.59 5.94 6.92 5.35 6.53 7.23 7.95 6.76 7.28 8.21 9.96];

需要拟合的方程是:ln S=k ln d+A/T+B

如何通过拟合求出k,A,B?

请大神们指点,感谢感谢!
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

pdl9527

专家顾问 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
料峭春寒5: 金币+20, ★★★★★最佳答案, 我先研究下,不懂的地方再多多向您请教哈,谢谢! 2017-08-28 19:36:47
[k,A,B]= [1.46      -2914.37          0.36];
下面是程序,你可以根据经验更改初值x0,也许能获得更好的结果。



function question_46
clear;clc;close all
T=[353.15 353.15 353.15 353.15 363.75 363.75 363.75 363.75 373.75 373.75 373.75 373.75 393.75 393.75 393.75 393.75 413.75 413.75 413.75 413.75];
d=[593.89 636.74 671.27 699.95 533.17 580.38 619.21 651.66 480.53 528.94 570.19 605.34 401.15 445.86 486.70 523.39 347.58 386.61 423.72 458.44];
S=[4.39 4.65 5.24 5.64 4.40 4.67 5.68 5.72 4.85 5.59 5.94 6.92 5.35 6.53 7.23 7.95 6.76 7.28 8.21 9.96];
fun=@(x) exp(x(1).*log(d)+x(2)./T+x(3))-S;
x0=[1,1,1];
[x,resnorm,residual,exitflag] = lsqnonlin(fun,x0)
plot3(T,d,S,'ro-')
hold on
plot3(T,d,fun(x)+S,'b*-')
5楼2017-08-28 19:06:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

smitest

木虫 (小有名气)

lsqnonlin是做非线性拟合的,这个问题是线性问题,不存在初值与更好结果的问题,
不考虑计算误差,准确的结果为 :    1.4374        -2864.4        0.36431
建议还是学学最小二乘的原理。
7楼2017-08-29 09:46:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

smitest

木虫 (小有名气)

算了,还是给你个参考,原始数据没贴上:
Z=log(S);
X=1./T;
Y=log(d);
% Z=kY+AX+B
a(1,1)=sum(Y.*Y);
a(2,1)=sum(X.*Y);
a(1,2)=a(2,1);
a(2,2)=sum(X.*X);
a(3,1)=sum(Y);
a(1,3)=a(3,1);
a(3,2)=sum(X);
a(2,3)=a(3,2);
a(3,3)=20;
b(1)=sum(Z.*Y);
b(2)=sum(Z.*X);
b(3)=sum(Z);
kAB=b/a;
8楼2017-08-29 09:50:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

tieer

木虫 (正式写手)

【答案】应助回帖

感谢参与,应助指数 +1
这个是不是用1stopt会简单很多啊
思考,让这个世界更有趣。
2楼2017-08-28 15:22:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

smitest

木虫 (小有名气)

3楼2017-08-28 15:33:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

smitest

木虫 (小有名气)

先改写成y= kx1+Ax2+B,利用最小二乘推导得M[k,A,B]=N解方程组直接得结果

发自小木虫Android客户端
4楼2017-08-28 17:35:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

料峭春寒5

新虫 (小有名气)

感谢,感谢!
6楼2017-08-28 19:35:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

pdl9527

专家顾问 (小有名气)

引用回帖:
8楼: Originally posted by smitest at 2017-08-29 09:50:47
算了,还是给你个参考,原始数据没贴上:
Z=log(S);
X=1./T;
Y=log(d);
% Z=kY+AX+B
a(1,1)=sum(Y.*Y);
a(2,1)=sum(X.*Y);
a(1,2)=a(2,1);
a(2,2)=sum(X.*X);
a(3,1)=sum(Y);
a(1,3)=a(3,1);
a(3,2)=sum ...

对于这个问题来说使用非线性最小二乘法来计算没有任何问题,你这里用的左除(mldivide),如果你打开帮助文件仔细阅读你会发现这样一行字,If A is a rectangular m-by-n matrix with m ~= n, and B is a matrix with m rows, then A\B returns a least-squares solution to the system of equations A*x= B. 意思是如果矩阵A是一个行列不相等的矩阵那么计算过程中采用最小二乘法,虽然非线性最小二乘法和线型最小二乘法可能存在一些差异,但是线型最小二乘法能够解决的问题非线性最小二乘法肯定是可以解决的,线性算是非线性的一种特殊形式,这里由于矩阵A的行列数不相等,所以不是一个唯一解的问题,因此才需要使用最小二乘法,左除之所以不需要提供初值是因为程序自动帮你选定了。
既然说使用非线性最小二乘法计算没有问题,那么计算结果为什么不同?这还是算法上的差异导致的,从结果可以看到两个方法计算的结果很接近,硬要说哪个好可以参考下面的程序,可以看出使用lsqnonline计算的结果的norm更小,因此更加精确,而不是像你说的:lsqnonlin是做非线性拟合的,这个问题是线性问题,不存在初值与更好结果的问题。

9楼2017-08-29 19:58:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

pdl9527

专家顾问 (小有名气)

引用回帖:
9楼: Originally posted by pdl9527 at 2017-08-29 19:58:54
对于这个问题来说使用非线性最小二乘法来计算没有任何问题,你这里用的左除(mldivide),如果你打开帮助文件仔细阅读你会发现这样一行字,If A is a rectangular m-by-n matrix with m ~= n, and B is a matrix w ...

function question_47
clear;clc;close all
T=[353.15 353.15 353.15 353.15 363.75 363.75 363.75 363.75 373.75 373.75 373.75 373.75 393.75 393.75 393.75 393.75 413.75 413.75 413.75 413.75]';
d=[593.89 636.74 671.27 699.95 533.17 580.38 619.21 651.66 480.53 528.94 570.19 605.34 401.15 445.86 486.70 523.39 347.58 386.61 423.72 458.44]';
S=[4.39 4.65 5.24 5.64 4.40 4.67 5.68 5.72 4.85 5.59 5.94 6.92 5.35 6.53 7.23 7.95 6.76 7.28 8.21 9.96]';
fun=@(x) exp(x(1).*log(d)+x(2)./T+x(3))-S;
x0=[1 1 1];
[x1,resnorm,residual,exitflag] = lsqnonlin(fun,x0);
x2=[log(d) 1./T ones(numel(T),1)]\log(S);
norm1=sum(fun(x1).^2)
norm2=sum(fun(x2).^2)
10楼2017-08-29 19:59:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 料峭春寒5 的主题更新
信息提示
请填处理意见