在符号表达式上使用 fplot 的问题
Issue with using fplot on a symbolic expression
这是一个 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
需要一个 returns 数值的表达式。 f
returns 一个 sym
(符号表达式),所以它不起作用,而 z
returns 一个数字 - 所以 它 确实。就是这样。
请注意,在工作示例中,您覆盖了第 2 和 行的 y
sym
,这意味着您提供了 "proper" function handle 至 fplot
、"by mistake"。事实上,您需要更少的代码来运行该示例:
fplot( @(x)2./x+6, [-1 1], 'b');
使顶级代码正常工作的最简单方法是使用 matlabFunction
。换句话说,您可以通过更改此行来修复您的代码:
f=@(bt) a1(i)
对此:
f = matlabFunction(a1(i));
这是一个 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
需要一个 returns 数值的表达式。 f
returns 一个 sym
(符号表达式),所以它不起作用,而 z
returns 一个数字 - 所以 它 确实。就是这样。
请注意,在工作示例中,您覆盖了第 2 和 行的 y
sym
,这意味着您提供了 "proper" function handle 至 fplot
、"by mistake"。事实上,您需要更少的代码来运行该示例:
fplot( @(x)2./x+6, [-1 1], 'b');
使顶级代码正常工作的最简单方法是使用 matlabFunction
。换句话说,您可以通过更改此行来修复您的代码:
f=@(bt) a1(i)
对此:
f = matlabFunction(a1(i));