【问题标题】:Issue with using fplot on a symbolic expression在符号表达式上使用 fplot 的问题
【发布时间】:2019-11-29 13:13:37
【问题描述】:

这是一个 fplot 不绘制任何内容的示例:

a=0.336;
Ta=9.476;
Te=1.208;
Tw=1.498;
eqh=[0.661;0.619;0.568];
ex=[-1.24;-1.346;-1.441];
en=-ex;
ey=[0.376;0.705;0.968];
eqx=[-0.309;-0.357;-0.392];
eh=[1.594;1.583;1.545];
eyqh=[0.642;0.78;0.897];
a0=a*Ta*Te^2;
syms bt Td Ki Kp;
a1=sym([]);a2=sym([]);a3=sym([]);a4=sym([]);exqh=sym([]);

for i=1:3
        Kp=1/bt;
        exqh(i)=en(i)*eqh(i)+eqx(i)*eh(i);
        Ki=1/(bt*Td);
        a1(i)=Ta*Tw*eqh(i)+a*Te^2*en(i)+a*Te^2*ey(i)*Kp;
        a2(i)=a*Te^2*ey(i)*Ki+Ta+Tw*exqh(i)-eyqh(i)*Kp*Tw;
        a3(i)=en(i)+ey(i)*Kp-eyqh(i)*Ki*Tw;
        a4(i)=ey(i)*Ki;
        assume(bt~=0)
        f=@(bt) a1(i)
        fplot(f,[0.01 1],'b')
        hold on
end

这是另一个例子,fplot 工作:

syms y x;
y=@(x) 2/x+6;
z=y;
assume(x~=0)
fplot(z,[-1 1],'b')

我无法理解这两种情况之间的区别。在我看来,它们是相同的。

谁能解释一下为什么上面的例子不起作用,但下面的例子起作用?

【问题讨论】:

  • 这个问题不清楚。 fplot documentation 有什么你不清楚的地方吗?
  • @Dev-iLe 'fplot(f,[0.01 1],'b')' 是错误的,但 'fplot(z,[-1 1],'b')' 是正确的。
  • 那是因为你的f 定义是可疑的。一方面,您将符号变量与 function_handle 无缘无故地混合在一起,另一方面,您将 function_handle 中的变量范围限定在完全不相交的地方。我确实需要指出,如果您遵循how to ask 指南并使用minimal examples,您可以确定问题的根源。后者不仅有利于提出 SO 问题。对自己的高效调试也有好处。

标签: matlab plot symbolic-math function-handle


【解决方案1】:

fplot 需要一个返回数值的表达式。 f 返回一个 sym(符号表达式),所以它不起作用,而 z 返回一个数字 - 所以 可以。这就是所有的区别。

请注意,在工作示例中,您覆盖了第 2nd 行的 y sym,这意味着您向 fplot 提供了“正确的”function handle,“by错误”。事实上,您需要更少的代码来让该示例工作:

fplot( @(x)2./x+6, [-1 1], 'b');

让顶级代码工作的最简单方法是使用matlabFunction。换句话说,您可以通过更改此行来修复您的代码:

f=@(bt) a1(i)

到这里:

f = matlabFunction(a1(i));

【讨论】:

  • 如何区分符号表达和非符号表达?
  • 情况正好相反。 fplot 不能接受使用符号变量的函数句柄。
  • @Y.zeng 你可以查看Workspace,或者运行命令whos。 @Argyll 你能详细说明一下吗?
  • @Adam:确实不,fplot 用于符号表达式。似乎 Matlab 也使其与 function_handles 兼容(sub 用于符号变量确实创建了 function_handles IIRC)。无论如何,我在那里给你的答案投了赞成票。 (由于缺乏重点,我最初投票结束了这个问题。)
  • @Adam 它们是不同的,是的,也许该通知不适用于sym 输入。事实上,如果你打开函数matlab.graphics.function.internal.sym2fn,它在sym 输入到fplot 的情况下执行,matlabFunction 正是被调用的。总结一下:要么您自己将符号表达式转换为函数句柄,要么 MATLAB 会为您隐式执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2013-05-26
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多