Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
索引越界(MATLAB)_Matlab_Cycle - Fatal编程技术网

索引越界(MATLAB)

索引越界(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;

我正在尝试获取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; 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的真实值