我正在写一个函数来计算p的值。
公式为p=r*q + pa
。 pa
值是我从ode45
函数获得的列向量。我必须改变q
w.r.t时间的值,即0到1秒q=500
,从1到2秒q=0
。
我写了这个程序:
function [p] = fom(t,pa)
r=0.007;
tin=1;
t=0:0.01:2;
if t <=tin
q = 600;
else t <= 2
q = 0;
end
[t,pa]=ode45('FOM1',[t],[0])
for i=[palv]
p=(r*q)+(i);
end
end
问题是我在输出1秒后得到正确的值,但在1秒之前,q为0,值不变。 这个if语句是否正确?
答案 0 :(得分:1)
问题是以下代码段:
if t <=tin
q = 600;
else t <= 2
q = 0;
end
使用t <= tin
,您可以将向量t
的每个元素与tin
进行比较。结果再次是一个向量,其中1
中的所有元素都包含t
,小于tin
,并且0
包含所有大于{{1}的元素,即
tin
根据documentation,[ 1 1 ... 1 1 0 0 ... 0 ]
评估以下内容:
当结果为非空并且仅包含非零元素(逻辑或实数)时,表达式为true。否则,表达式为false。
由于向量包含1和0,即不仅是非零元素,因此它总是计算为 false ,并且将执行if
子句。因此,else
将是一个标量,而不是一个向量,它总是q
。要获取向量0
,对于所有q
为600,否则为零,您可以使用
t <= tin
创建上面打印的这样一个向量,并将其乘以600。
现在,您的代码有很多评论:
关于q = 600*(t <= tin);
:在else
中,您不能有任何其他条件,因此else
只会执行并打印到控制台,但这不会做任何事情,所以你可以把它留下。
您有t <= 2
和t
作为该函数的输入,但从不使用它们。 pa
只是被覆盖了。因此,要么留下t
输入并且不要覆盖它,要么将其作为输入留下。此外,您可以删除t
作为输入,因为您使用pa
计算了它。
我认为ode45
是拼写错误,应该是for i = palv
。
在此for循环中,通过调用for i = pa
,p=(r*q)+(i);
会在每次迭代中被覆盖,即结果p
将为p
加上{{1}的最后一个元素}}。
您可以使用
r*q
pa
一切都在一起,功能就变成了
p
并且可以被称为例如通过
p = r*q + pa