索引越界(MATLAB)
我正在尝试获取p(4)的值(很抱歉) 方程式如下所示: 4800+p1+p2*z/1000+p3*e^(-p4*z/1000) 我不断地发现这个错误: 试图访问p(4);索引超出范围,因为numel(p)=3 波浪中的错误(第32行) xy1=4800+5.6596+14.5820/1000*xs+257.4318*exp(-p(4)/1000) 我如何更改numel中的“边界”,或者我还可以做些什么来解决此问题 代码索引越界(MATLAB),matlab,cycle,Matlab,Cycle,我正在尝试获取p(4)的值(很抱歉) 方程式如下所示: 4800+p1+p2*z/1000+p3*e^(-p4*z/1000) 我不断地发现这个错误: 试图访问p(4);索引超出范围,因为numel(p)=3 波浪中的错误(第32行) xy1=4800+5.6596+14.5820/1000*xs+257.4318*exp(-p(4)/1000) 我如何更改numel中的“边界”,或者我还可以做些什么来解决此问题 代码 z = [0.0; 500; 1000; 1500; 2000; 2500;
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')
了解到您正试图适应此处描述的模型: i、 e.
f(z)=4800+p1+p2*z/1000+p3*exp(-z*p4/1000)
问题是这是一个非线性方程,因此不能简单地使用MATLAB反斜杠运算符。您需要按照答案的建议进行操作,并在优化工具箱中使用lsqnonlin
,或在曲线拟合工具箱中拟合自定义方程
就我个人而言,我倾向于曲线拟合工具箱,我将使用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始终为正,可以通过将下限设置为零来实现。您在这里想做什么?既然
A
在这里是17x3
,而y
是17x1
,p
将是3x1
,您正试图访问不存在的p(4)
。我正在尝试获取p(4)的值,所以您希望p
是4x1
矩阵?你能解释一下p应该是什么吗?是的,这是正确的(4x1),因为你说的第一句话(3x1),然后p(4)就不见了。p只是一个变量,但应该是1.*你是在试图为向量p
解方程y=a*p
吗?或者你想用A
中的值除以y
中的值(正如@Huguenot建议的那样)?这就是我从一开始就做的,我更新了第一篇帖子。问题是要得到p4的实际值。在第一篇文章中,如果你能看到,你的模型是<代码> f(z)=p(1)*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/Oy)+p(*)*/y+p(x)< /代码>不是常数,我粘贴了方程式。因为f(z)
取决于输入的z
的值。这意味着p(4)不是一个常数。这与p(1)
、p(2)
和p(1)
形成对比,它们是使用反斜杠运算符找到的常量。好消息是,你可能已经解决了你的问题。您已经为数据拟合了一个非常好的模型,并且(通过一个图)显示了它是如何紧密地映射到z
和y
。你觉得还需要显示什么?我需要p4的正确值,因为在开始时,p4被设置为1作为开始猜测值,我需要得到p4的真实值