【问题标题】:Index out of bounds (MATLAB)索引越界 (MATLAB)
【发布时间】:2013-05-29 20:27:51
【问题描述】:

我正在尝试获取 p(4) 的值(对此感到抱歉)

等式如下所示: 4800+p1+p2*z/1000+p3*e^(-p4*z/1000)

我不断收到此错误: 试图访问 p(4);索引超出范围,因为 numel(p)=3。

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

如何更改 numel 中的“边界”,或者我可以做些什么来解决这个问题?

代码

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')

【问题讨论】:

  • 你想在这里做什么?好吧,因为A 在这里是17 x 3y17 x 1p 将是3 x 1,而您正在尝试访问不存在的p(4)
  • 我正在尝试获取 p(4) 的值
  • 所以你期望p 是一个4 x 1 矩阵?你能解释一下 p 应该是什么吗?
  • 是的,那是正确的 (4x1),因为你说的第一件事是 (3x1),然后 p(4) 就不见了。 p 只是一个变量,但应该产生 1.* 的东西
  • 您是否要为向量p 求解方程y = A*p?或者您是否试图将A 中的值除以y 中的值(正如@Huguenot 建议的那样)?

标签: matlab cycle


【解决方案1】:

知道您正在尝试拟合此处描述的模型:

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 执行以下操作:

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

   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 始终为正,可以通过将下限设置为零来实现。

【讨论】:

  • 我从一开始就是这样做的,我更新了第一篇文章。问题是要获得 p4 的实际值。如果您能看到,我将方程式粘贴在第一篇文章中。
  • 因此,如果我们将您的模型视为f(z) = p(1)*exp(-z/1000) + p(2)*z/1000 + p(3),您会将 p(4) 放在哪里
  • p(4) = p(1)*exp(-z/1000) + p(2)*z/1000 + p(3) ?
  • 问题在于表达式p(1)*exp(-z/1000) + p(2)*z/1000 + p(3) 不是一个常数,因为f(z) 取决于您输入的z 的值。这意味着 p(4) 不是一个常数值。这与 p(1)p(2)p(1) 形成对比,它们是使用反斜杠运算符找到的常量。好消息是,您可能已经解决了您的问题。您已经为您的数据拟合了一个非常好的模型,并且您已经展示了(通过绘图)它如何紧密地映射到 zy。你觉得还需要展示什么?
  • 我需要 p4 的正确值,因为一开始 p4 被设置为 1 作为开始猜测值,我需要得到 p4 的实际值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 2016-03-09
  • 2014-06-06
  • 2013-07-27
  • 2015-03-22
相关资源
最近更新 更多