有没有一种方法可以组合多个函数进行绘图而无需在 MATLAB 中重新键入它们?

Is there a way to combine multiple functions for plotting without retyping them in MATLAB?

在我目前参加的 类 中,有相当多的密谋正在进行。为了加快速度,我开始使用 fplot 而不是 plot。现在我想知道是否有一种方法可以将两个函数组合在一起而无需重新键入它们。

像这样:

t = @(x) x;
w = @(x) x;

d = @(x) t + w;
fplot(d,[-1,1]);

执行此操作的能力将使调试和编辑更加容易,并节省大量编码时间。

我的一个想法是使用字符串来携带函数。

t = 'x';
w = 'x';

d = @(x) t + w;

但我一直没能找到改回它的方法(除了相应的 ASCII 值)。

我想另一种方法是使用省略号并将行分开以便于查看,但这并没有解决核心问题。

如果你想要更多的背景知识或理解:下面是我们必须绘制的一些函数的例子。

Cn = @(a) (1 - (rn/rc)^2*cos(dc)^2)*cos(dc)^2*sin(2*a);
Ca = @(a) ((1 - sin(dc)^4) * (rn/rc)^2) + (2 * sin(dc)^2 * cos(a)^2 + cos(dc)^2 * sin(a)^2) * (1 - (rn/rc)^2 * cos(dc)^2);

Cl = @(a) ((1 - (rn/rc)^2*cos(dc)^2)*cos(dc)^2*sin(2*a)) * cos(a) - (((1 - sin(dc)^4) * (rn/rc)^2) + (2 * sin(dc)^2 * cos(a)^2 + cos(dc)^2 * sin(a)^2) * (1 - (rn/rc)^2 * cos(dc)^2))*sin(a);
Cd = @(a) ((1 - (rn/rc)^2*cos(dc)^2)*cos(dc)^2*sin(2*a)) * sin(a) + (((1 - sin(dc)^4) * (rn/rc)^2) + (2 * sin(dc)^2 * cos(a)^2 + cos(dc)^2 * sin(a)^2) * (1 - (rn/rc)^2 * cos(dc)^2)) * cos(a);

ld = @(a) (((1 - (rn/rc)^2*cos(dc)^2)*cos(dc)^2*sin(2*a)) * cos(a) - (((1 - sin(dc)^4) * (rn/rc)^2) + (2 * sin(dc)^2 * cos(a)^2 + cos(dc)^2 * sin(a)^2) * (1 - (rn/rc)^2 * cos(dc)^2))*sin(a)) / (((1 - (rn/rc)^2*cos(dc)^2)*cos(dc)^2*sin(2*a)) * sin(a) + (((1 - sin(dc)^4) * (rn/rc)^2) + (2 * sin(dc)^2 * cos(a)^2 + cos(dc)^2 * sin(a)^2) * (1 - (rn/rc)^2 * cos(dc)^2)) * cos(a));

其中很多都是我们自己推导的方程式,作为作业的一部分,所以如果我们在推导一个函数时出错,我们必须重写所有的函数。在这里,我们得到了 Cn 和 Cl(使用了 Cn 和 Ca),但必须自己导出 Ca 和 Cd。 "ld" 就是 cl 除以 cd。

简化后,它们可能看起来像这样:

Cl = @(a) Cn * cos(a) - Ca * sin(a)
Cd = @(a) Cn * sin(a) + Ca * cos(a)

ld = @(a) Cl / Cd

我在仔细阅读此网站以寻求答案时得到了很多帮助,但我找不到其他人问这个问题或类似问题。如果您知道另一个 post 对此有解决方案,我会很高兴首先阅读它。希望你能帮上忙!

t in t = @(x) x;是一个句柄,显然你不能对句柄执行+-/*等操作。

我会这样做:

f1 = @(x)(x.^2 + x.^3);
f2 = @(x)(2 * x.^2 + 5 * x);
x = linspace(-1,1,100);
y1 = feval(f1,x) + feval(f2,x);
y2 = feval(f1,x) ./ feval(f2,x);
plot(x,y1,'r',x,y2,'b')

即使我得到了昵称"Captain Obvious",我还是要说明编写函数句柄的直截了当的方法。 :-)

%'The operators .*, .^ and ./ are safer when "a" is not scalar'
%'assuming that everything else is'
Cn = @(a) (1 - (rn/rc)^2*cos(dc)^2)*cos(dc)^2*sin(2*a);
Ca = @(a) ((1 - sin(dc)^4) * (rn/rc)^2) + (2 * sin(dc)^2 * cos(a).^2 + cos(dc)^2 * sin(a).^2) * (1 - (rn/rc)^2 * cos(dc)^2);

Cl = @(a) Cn(a) .* cos(a) - Ca(a) .* sin(a);
Cd = @(a) Cn(a) .* sin(a) + Ca(a) .* cos(a);

ld = @(a) Cl(a) ./ Cd(a);

调用再次明显:

ld(3);
ld([1,2;3,4]);