索引越界(MATLAB)

时间:2013-05-29 20:27:52

标签: matlab cycle

我试图获得p(4)的值(对不起)

等式看起来像这样: 4800 + P1 + P2 * Z / 1000 + P3 * E ^( - P4 * Z / 1000)

我一直收到这个错误: 试图访问p(4);因为数字(p)= 3,所以索引越界。

波浪中的错误(第32行) xy1 = 4800 + 5.6596 + 14.5820 / 1000 * xs + 257.4318 * exp(-p(4)/ 1000);

如何更改数字中的“界限”或者我还能做些什么来解决这个问题?

代码

z = [0.0; 500; 1000; 1500; 2000; 2500; 3000; 3500; 4000; 5000; 6000; 7000; 8000; 9000; 10000; 11000; 12000];
y = [5050 4980 4930 4890 4870 4865 4860 4860 4865 4875 4885 4905 4920 4935 4950 4970 4990]'-4800 ;
A = [ones(numel(z),1) z./1000 exp(-z./1000)];
p = A\y;
norm(p);
y = y+4800;

xs = 0:1:12000;
xy = 4800+5.6596+14.5820/1000*xs+257.4318*exp(-p(4)/1000);
subplot(2,2,4), plot(z,y,'o')
hold on
subplot(2,2,4), plot(xs,xy);
title('p4')

编辑:::::::

我首先得到了这个,其中p4有一个开始猜测(值)(p4 = 1),然后我将p1,p2,p3结果放入一个新文件中以尝试解决p4,这就是上面的代码。

z = [0.0; 500; 1000; 1500; 2000; 2500; 3000; 3500; 4000; 5000; 6000; 7000; 8000; 9000; 10000; 11000; 12000];
y = [5050 4980 4930 4890 4870 4865 4860 4860 4865 4875 4885 4905 4920 4935 4950 4970 4990]'-4800 ;
A = [ones(numel(z),1) z./1000 exp(-z./1000)];
p = A\y;
norm(p);
y = y+4800;

xs = 0:1:12000;
xy = 4800+p(1)+p(2)/1000*xs+p(3)*exp(-xs/1000);
subplot(2,2,1), plot(z,y,'o')
hold on
subplot(2,2,1), plot(xs,xy);
title('p1,p2,p3')

1 个答案:

答案 0 :(得分:2)

了解您正试图适应此处描述的模型:

https://math.stackexchange.com/questions/214797/soundwaves-under-the-water

即。 f(z) = 4800 + p1 + p2*z/1000 + p3*exp(-z*p4/1000)

问题在于它是一个非线性方程,因此您不能简单地使用MATLAB反斜杠运算符。您将需要执行答案建议,并在优化工具箱中使用lsqnonlin或在曲线拟合工具箱中拟合自定义方程。

就个人而言,我偏向于Curve Fitting Toolbox,我会用cftool做以下事情:

enter image description here

在这里我们可以看到系数估计是:

   p1 =      -20.21  (-29.34, -11.08)
   p2 =       17.34  (16.31, 18.36)
   p3 =       272.9  (263.3, 282.5)
   p4 =      0.7528  (0.6964, 0.8092)

请记住,我的下限和上限非常宽松。如果你想确保p1始终是正数,你可以通过将下限设置为零来实现。