1

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

像这样的东西:

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

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

这样做的能力将使调试和编辑更容易,并节省大量编码时间。

我的一个想法是使用字符串来携带该功能。

IE

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

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

4

2 回答 2

2

即使我会得到“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]);
于 2015-09-28T11:49:20.930 回答
0

tint = @(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')
于 2015-09-28T10:15:41.160 回答