声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1934|回复: 6

[计算数学] [求助]:利用最小二乘法来优化参数的问题?

[复制链接]
发表于 2006-11-14 17:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
各位高手,有谁知道有关非线性最小二乘法在MATLAB中实现的程序,能否告知一二,谢谢!

[ 本帖最后由 咕噜噜 于 2007-6-15 08:54 编辑 ]
回复
分享到:

使用道具 举报

发表于 2006-11-15 07:10 | 显示全部楼层
有现成的函数,lsqnonlin
 楼主| 发表于 2006-11-15 09:28 | 显示全部楼层
现在有一段这样的程序,如下:
首先编制非线性模型m文件(sta67_2m.m):
function yy=model(beta0,x)
a1=beta0(1);
b1=beta0(2);
a2=beta0(3);
b2=beta0(4);
a3=beta0(5);
b3=beta0(6);
a4=beta0(7);
b4=beta0(8);
a5=beta0(9);
b5=beta0(10);
dd1=a1*sin(4.3945*dd2+b1)+a2*sin(4.3945*dd2+b2)+a3*sin(4.3945*dd2+b3)+a4*sin(4.3945*dd2+b4)+a5*sin(4.3945*dd2+b5);

然后在命令栏里面输入:
yy=Data(2100*500:2103*500);dd1=yy;
x=0:0.002:3;dd2=x';
beta0=[0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5];
betafit=nlinfit(dd2,dd1,'sta67_2m.m',beta0);

这里用的是nlinfit命令,我试着运行了一下,结果是这样:
??? Error using ==> nlinfit
The inline model function generated the following error:
Error using ==> inline.subsref
Too many inputs to inline function.

哪位高手能帮我解决这个问题呀?谢谢!
发表于 2006-11-16 07:21 | 显示全部楼层
  1. function yy=model(beta0,x)
  2. a1=beta0(1);
  3. b1=beta0(2);
  4. a2=beta0(3);
  5. b2=beta0(4);
  6. a3=beta0(5);
  7. b3=beta0(6);
  8. a4=beta0(7);
  9. b4=beta0(8);
  10. a5=beta0(9);
  11. b5=beta0(10);
  12. dd1=a1*sin(4.3945*dd2+b1)+a2*sin(4.3945*dd2+b2)+a3*sin(4.3945*dd2+b3)+a4*sin(4.3945*dd2+b4)+a5*sin(4.3945*dd2+b5);
复制代码


文件名改为model.m,保持文件名和函数名一致,另外该该函数的内容整个都是错误的,建议采用
  1. edit hougen
复制代码

看一下正确定的应该是怎么写的吧

调用改为
  1. betafit=nlinfit(dd2,dd1,'model',beta0);
复制代码


从楼上写的程序看,楼主应该基本没有写过matlab程序,建议找本matlab入门的书籍先看看

评分

1

查看全部评分

 楼主| 发表于 2006-11-16 12:46 | 显示全部楼层
楼上的高手,谢谢你的解答。但是我昨晚自己修改了一下我上面贴的程序,可以运行了,但是拟合出来的数据不对,不知道是何缘故?
可运行的程序如下:
首先编制非线性模型m文件(sta67_2m.m)[昨天我这个文件存错了地方,结果老是抱错,我现在是保存在运行目录下的]:
function dd1=model(beta0,dd2)
a=beta0(1);
b=beta0(2);
c=beta0(3);
d=beta0(4);
e=beta0(5);
f=beta0(6);
g=beta0(7);
h=beta0(8);
k=beta0(9);
l=beta0(10);
dd1=a*sin(2*pi*0.97656*dd2+b)+c*sin(2*pi*1.9531*dd2+d)+e*sin(2*pi*2.9297*dd2+f)+g*sin(2*pi*3.9063*dd2+h)+k*sin(2*pi*4.8828*dd2+l);

然后在命令栏里面输入:
yy=Data(2100*500:2103*500);dd1=yy';
x=0:0.002:3;dd2=x;
beta0=[0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5];
nlintool(dd2,dd1,'sta67_2m',beta0);
betafit=nlinfit(dd2,dd1,'sta67_2m',beta0);

betafit=0.039909             -35.47
             -0.044785              0.075721
             -0.13027              0.8733
              0.32827              11.404
             0.40317        -4.0571
然后我将实际dd1值的图形和拟合出来的dd1的图形进行对比(见附图1和附图2),从两图可以看出可以看出图形形状不一样且大小也差的很远,不知道这是怎么回事?

[ 本帖最后由 xinyuxf 于 2006-12-23 09:51 编辑 ]
发表于 2006-11-19 07:24 | 显示全部楼层
估计是初值选择问题,这是个很头疼的事情,一般没有什么太好的办法解决

建议采用一些对初值不敏感的算法
 楼主| 发表于 2006-11-20 09:26 | 显示全部楼层
请问有哪些命令对初值不敏感呢?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-26 13:24 , Processed in 0.064849 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表