if语句带有for循环

时间:2015-12-28 13:19:56

标签: matlab if-statement for-loop

我正在写一个函数来计算p的值。

公式为p=r*q + papa值是我从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语句是否正确?

1 个答案:

答案 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 <= 2t作为该函数的输入,但从不使用它们。 pa只是被覆盖了。因此,要么留下t输入并且不要覆盖它,要么将其作为输入留下。此外,您可以删除t作为输入,因为您使用pa计算了它。

我认为ode45是拼写错误,应该是for i = palv

在此for循环中,通过调用for i = pap=(r*q)+(i);会在每次迭代中被覆盖,即结果p将为p加上{{1}的最后一个元素}}。 您可以使用

创建不带for循环的向量r*q
pa

一切都在一起,功能就变成了

p

并且可以被称为例如通过

p = r*q + pa