chuanyaozhou 发表于 2010-1-7 09:46

求助:运行lsqcurfit时出现Matrix dimensions must agree的错误

实验测得两组数据,要用下面这个函数
y=x(1)*trapz(t,exp(-abs((xdata*1e-15-t)/x(2))).*exp(-3*log(2)*(t/x(3)).^2)),t=(linspace(-200e-15,200e-15,3000))'
进行拟合,程序如下:

function f=onewfit(x,xdata)
t=(linspace(-200e-15,200e-15,3000))';
f1w=exp(-abs((xdata*1e-15-t)/x(2))).*exp(-3*log(2)*(t/x(3)).^2);
f=x(1)*trapz(t,f1w);

xdata=-28.07
-26.733
-25.397
-24.06
-22.723
-21.387
-20.05
-18.713
-17.377
-16.04
-14.703
-13.367
-12.03
-10.693
-9.3567
-8.02
-6.6833
-5.3467
-4.01
-2.6733
-1.3367
0
1.3367
2.6733
4.01
5.3467
6.6833
8.02
9.3567
10.693
12.03
13.367
14.703
16.04
17.377
18.713
20.05
21.387
22.723
24.06
25.397
26.733
28.07
29.407
30.743
32.08
33.417
34.753
36.09
37.427
38.763
40.1
41.437
42.773
44.11
45.447
46.783
48.12
49.457
50.793
52.13
53.467
54.803
56.14
57.477
58.813
60.15
61.487
62.823
64.16
65.497
66.833
68.17
69.507
70.843
72.18
73.517
74.853
76.19
77.527
78.863
80.2
81.537
82.873
84.21
85.547
86.883
88.22
89.557
90.893
92.23
93.567
94.903
96.24
97.577
98.913
100.25
101.59

ydata=3.542
4.3628
5.2718
6.0982
7.1
7.9064
9.1087
9.991
11.039
11.998
12.717
13.749
14.791
15.482
16.094
16.857
17.439
17.722
18.442
18.588
19.151
18.638
18.6
18.509
18.37
17.887
17.088
16.714
16.107
15.297
14.286
13.447
12.505
11.45
10.203
9.461
8.5291
7.3575
6.7977
5.9653
4.927
4.0811
3.5185
2.8233
2.213
1.4887
1.0284
0.87324
0.98524
0.72658
0.98301
0.8818
0.93085
0.93437
1.2345
1.1338
1.0784
1.1148
1.3607
1.2652
1.1519
1.1537
1.0809
1.0139
0.93833
0.91336
0.78025
0.83429
0.6424
0.78952
0.66733
0.52645
0.57302
0.54375
0.68102
0.59113
0.29401
0.53691
0.56787
0.57317
0.60167
0.49723
0.6663
0.39746
0.63391
0.64165
0.35578
0.37859
0.37817
0.34839
0.082668
0.15233
0.16759
0.37992
0.25172
0.30564
0.048891
1.9698

x0=;
=lsqcurvefit(@onewfit,x0,xdata,ydata);
运行出现如下错误:
??? Error using ==> optim\private\lsqncommon
User supplied function failed with the following error:

Error using ==> unknown
Matrix dimensions must agree.

Error in ==> lsqcurvefit at 149
= ...

Error in ==> Onewlsqfit
=lsqcurvefit(@onewfit,x0,xdata,ydata)

刚接触Matlab,实在找不出原因,请高手帮忙,先行谢过了。

maigicku 发表于 2010-1-7 10:34

希望LZ把程序给完整。。。

chuanyaozhou 发表于 2010-1-7 10:44

回复 沙发 maigicku 的帖子

我就想用最小二乘法拟合得出参数x的三个值,就写了这么多

ChaChing 发表于 2010-1-7 14:14

回复 沙发 maigicku 的帖子

xdata:98*1, t:3000*1 !!

chuanyaozhou 发表于 2010-1-7 14:24

回复 地板 ChaChing 的帖子

谢谢你的回复。
但是我这里自变量是xdata,而函数值y是用这个函数exp(-abs((xdata*1e-15-t)/x(2))).*exp(-3*log(2)*(t/x(3)).^2)对 t 积分,所以t 跟xdata的维数要一致我就不理解了。能不能给我解释下?谢谢!

maigicku 发表于 2010-1-7 15:58

回复 5楼 chuanyaozhou 的帖子

其实LZ出的问题不光是维数问题。。我一直没有回帖,是因为正在考虑用别的积分函数代替trapz。。
回LZ的问题:t与xdata维数要一致,xdata是98X1的矩阵,t是3000x1的矩阵,xdata-t会出错。。。
即使将t的维数改成98x1,拟合时仍会出错

chuanyaozhou 发表于 2010-1-7 16:09

回复 6楼 maigicku 的帖子

谢谢maigicku., 根据你的提示,我把函数定义部分修改了一下,
function f=onewfit(x,xdata)
t=(linspace(-200e-15,200e-15,3000))';
l=length(xdata);
for i=1:l
f1w=exp(-abs((xdata(i,1)*1e-15-t)/x(2))).*exp(-3*log(2)*(t/x(3)).^2);
f(i,1)=x(1)*trapz(t,f1w);
end
现在程序倒是能运行了,但是结果一看就是错的,我正琢磨这个呢。
如果你能给我提供帮助,那真是太感谢了。

感觉程序根本就没有进行运算,因为最后得出的参数值就是我给的初始值。
最开始给的初始值有问题,数量级不对,比较接近的是.

[ 本帖最后由 ChaChing 于 2010-1-7 16:54 编辑 ]

maigicku 发表于 2010-1-7 19:50

回复 7楼 chuanyaozhou 的帖子

LZ的拟合公式有问题。。。而且xdata,ydata的分布也不好,所以会出现参数值就是初始值的情况,下面是我做出来的图:

红线是拟合的公式,蓝线是实际分布曲线,参数值为
从图像上可以看出,LZ的拟合公式不合适。。

[ 本帖最后由 maigicku 于 2010-1-7 19:53 编辑 ]
页: [1]
查看完整版本: 求助:运行lsqcurfit时出现Matrix dimensions must agree的错误