有没有办法结合多个函数进行绘图而无需在MATLAB中重新输入?

时间:2015-09-28 09:49:08

标签: string matlab typeconverter function-handle

在我目前正在上课的课程中,有相当多的情节正在进行中。为了加快速度,我开始使用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

我得到了很多帮助,仔细阅读了这个网站的答案,但我一直无法找到其他人问这个问题或类似的问题。如果您知道另一篇有此解决方案的帖子,我会很高兴首先阅读。希望你能帮忙!

2 个答案:

答案 0 :(得分: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]);

答案 1 :(得分:0)

t中的{p> 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')