如何用两个参数2D绘制我自己的函数?

时间:2014-01-04 16:54:13

标签: matlab

我几小时前就开始使用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

我现在想要使用特定参数trianglet范围绘制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传递给它。

3 个答案:

答案 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结合使用'第三个输入参数,用于控制那个)。

也就是说,正如其他海报所指出的那样,您的示例输入部分fplott<0分支中最终会产生错误。