【问题标题】:if statement with for loop带有 for 循环的 if 语句
【发布时间】:2015-12-28 13:19:55
【问题描述】:

我正在编写一个函数来计算 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 语句正确吗?

【问题讨论】:

  • 你的代码有很多错误。您有两个输入,但您没有使用它们,(t,pa)。您定义 t 和 pa 但不使用变量。 palv 是什么?

标签: matlab if-statement for-loop


【解决方案1】:

问题出在以下代码sn-p:

if t <=tin
    q = 600;
else t <= 2
    q = 0;
end

使用t &lt;= tin,您可以将向量t 的每个元素与tin 进行比较。结果又是一个向量,其中包含1 用于t 中小于tin 的所有元素,以及0 用于所有大于tin 的元素,即

[ 1    1    ...     1    1    0    0    ...    0 ]

根据documentationif 评估以下内容:

当结果为非空且仅包含非零元素(逻辑或实数)时,表达式为真。否则,表达式为假。

由于向量包含 1 和 0,即不仅是非零元素,因此 this 总是评估为 false 并且将执行 else 子句。因此q 将是一个标量,而不是一个向量,它总是0。要获得一个向量 q,对于所有 t &lt;= tin,它是 600,否则为零,您可以使用

q = 600*(t <= tin);

创建上面打印的矢量,并将其乘以 600。

现在,您的代码中有许多 cmets:

关于else: 在else 中,你不能有任何其他条件,所以t &lt;= 2 只会被执行并打印到控制台,但这没有任何作用,所以你可以离开它。

您有 tpa 作为函数的输入,但永远不要使用它们。 t 被简单地覆盖。所以要么留下t 一个输入并且不要覆盖它,或者把它作为输入留下。此外,您可以删除 pa 作为输入,因为您使用 ode45 计算它。

我认为for i = palv 是一个错字,应该是for i = pa

在这个 for 循环中,通过调用 p=(r*q)+(i);p 在每次迭代中都会被覆盖,即生成的 p 将是 r*q 加上 pa 的最后一个元素。 你可以创建一个向量 p 而不使用 for 循环使用

p = r*q + pa

一切结合起来,功能就变成了

function p = fom(t)

r=0.007;
tin=1;

q = 600 * (t <= tin);
[t,pa]=ode45('FOM1',[t],[0])
p = r*q + pa

end

并且可以被称为例如由

t = 0:0.01:2
p = fom(t);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2014-09-26
    相关资源
    最近更新 更多