我几小时前就开始使用MATLAB,并开始绘制一些简单的函数,例如:
k = -20:20;
a = 0.01;
x_k = exp(-a * k.^2)
f_1 = figure(1);
plot(k, x_k)
这很好用,并在x轴上绘制k
的每个值,并在y轴上绘制相应的函数响应。现在我已经定义了自己的功能:
function [y] = triangle(t, a)
if (a <= t) & (t <= 0)
y = (1/a * t + 1) * a
elseif (0 <= t) & (t <= a)
y = (-1/a * t + 1) * a
else
error('Function not defined for these values')
end
end
我现在想要使用特定参数triangle
为t
范围绘制a
。所以我打电话给:
a = 1;
int = (2 * a) / 20;
t = -a:int:a;
f_1 = figure(1);
plot(t, triangle(t, a))
...但是我的函数错误了,因为整个t
数组(向量,我想?)被传递给它而不是t
的每个元素。
如何在定义的范围内为特定triangle
绘制a
函数?
我也试过fplot(triangle(a), t)
(因为fplot
接受一个函数作为参数)但是这又抱怨triangle
没有收到足够的输入参数 - 这是正确的,但我需要也将a
传递给它。
答案 0 :(得分:1)
问题在于您将向量传递给函数triangle
,但是您想要检查vetor t
的每个单独值的每个if语句。所以你要么在函数三角形中使用for
- 循环,要么你也可以使用它:
function [y] = triangle(t, a)
y = ((a <= t) & (t <= 0)) .* ((1/a * t + 1) * a) + ((0 <= t) & (t <= a)) .* ((-1/a * t + 1) * a);
end
我知道它看起来有些奇怪,但是如果你需要我更详细地解释它,我可以为你做这些; - )
编辑:让我们不久检查一下这个问题:你将一个向量t
传递给该函数,这意味着第一个if语句if (a <= t) & (t <= 0)
已经拆分为:
(a <= t) % resulting in:
ans =
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
(t <= 0) % resulting in:
ans =
1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
所以通过AND
运算符(向量为&
)将它们组合起来,这显然可以为您提供
ans =
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
所以这个分支不会被执行。 elseif给你:
(0 <= t)
ans =
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
(t <= a)
ans =
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
((0 <= t) & (t <= a))
ans =
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
因此,即使您希望在值的后半部分执行它,也不会执行此操作,因为您希望检查每个值对的两个语句。
因此,完全放弃语句就可以像上面发布的那样完成:简单地将逻辑语句元素的结果与分段函数相乘,这将产生您想要计算的结果: - )
答案 1 :(得分:1)
最好的方法是定义triangle
函数,以便它允许向量输入。您可以使用logical indexing执行此操作,NaN
根据逻辑条件选择t
的值范围:
function [y] = triangle(t, a)
y = NaN(size(t)); %// pre-allocate and define NaN as default return value
ind = (a <= t) & (t <= 0); %// select first range
y(ind) = (1/a * t(ind) + 1) * a; %//compute output for first range
ind = (0 <= t) & (t <= a); %// select second range
y(ind) = (-1/a * t(ind) + 1) * a; %//compute output for second range
end
这会返回{{3}}以获取超出范围的值。例如,对于t
,
>> triangle(t, a)
ans =
Columns 1 through 13
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0000 0.9000 0.8000
Columns 14 through 21
0.7000 0.6000 0.5000 0.4000 0.3000 0.2000 0.1000 0
一旦定义了这样的函数,就可以plot(t, triangle(t, a))
。
答案 2 :(得分:1)
要将函数传递给fplot
,您需要使用匿名函数(就像在许多其他编程语言中称为lambda)。
这是通过matlab中的@
语法完成的(有关如何使用此内容,请参阅help function_handle
。)
所以你的fplot
尝试应该是:
fplot(@(x) triangle(x,a), t([1 end]))
请注意,t
的{{1}}输入是您要评估函数的范围,而不是评估自身的值(您可以将边界与fplot
结合使用'第三个输入参数,用于控制那个)。
也就是说,正如其他海报所指出的那样,您的示例输入部分fplot
在t<0
分支中最终会产生错误。