Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab中用标准绘图函数绘制符号方程_Matlab_Plot_Symbolic Math - Fatal编程技术网

在Matlab中用标准绘图函数绘制符号方程

在Matlab中用标准绘图函数绘制符号方程,matlab,plot,symbolic-math,Matlab,Plot,Symbolic Math,为了获得流体行为的图形表示,通常绘制其流线 对于给定的二维流体,其速度分量u=Kx和v=-Ky(其中K为常数,例如:K=5),可通过积分流速场分量获得流线方程,如下所示: syms x y K = 5; %Constant. u = K*x; %Velocity component in x direction. v = -K*y; %Velocity component in y direction. A = int(1/u,x); %First integral. B = int(1/

为了获得流体行为的图形表示,通常绘制其流线

对于给定的二维流体,其速度分量u=Kx和v=-Ky(其中K为常数,例如:K=5),可通过积分流速场分量获得流线方程,如下所示:

syms x y

K = 5; %Constant.

u = K*x; %Velocity component in x direction.
v = -K*y; %Velocity component in y direction.

A = int(1/u,x); %First integral.
B = int(1/v,y); %Second integral.

for C = -10:0.1:10; %Loop. C is assigned a different value in each iteration.
    eqn = A == B + C; %Solved streamline equation.
    ezplot(eqn,[-1,1]); %Plot streamline.
    hold on;
end

axis equal;
axis([-1 1 -1 1]);
流线方程:∫dx/u=∫dy/v

解出的方程如下所示:A=B+C(其中A是第一个积分的解,B是第二个积分的解,C是积分常数)

一旦我们实现了这一点,我们就可以开始绘制流线,只需将一个值指定给C,例如:C=1,然后绘制生成的方程。这将生成一个单一的流线型,因此为了获得更多的流线型,您需要迭代最后一步,每次分配不同的C值

我已经成功地绘制了这一特定流程的流线图,方法是让matlab以符号方式绘制方程式,并使用
ezplot
生成如下图形:

syms x y

K = 5; %Constant.

u = K*x; %Velocity component in x direction.
v = -K*y; %Velocity component in y direction.

A = int(1/u,x); %First integral.
B = int(1/v,y); %Second integral.

for C = -10:0.1:10; %Loop. C is assigned a different value in each iteration.
    eqn = A == B + C; %Solved streamline equation.
    ezplot(eqn,[-1,1]); %Plot streamline.
    hold on;
end

axis equal;
axis([-1 1 -1 1]);
结果是:

问题在于,对于流的某些特定区域,
ezplot
不够精确,不能很好地处理奇点(渐近线等)。这就是为什么为了获得更好的视觉输出,标准的“数字”
绘图似乎是可取的

这里的挑战是将符号流线型解决方案转换为与标准
plot
函数兼容的显式表达式

我尝试过这样做,使用
subs
solve
都没有成功(Matlab抛出了一个错误)

这是命令窗口上显示的错误:

Error using mupadmex
Error in MuPAD command: Division by zero.
[_power]

Evaluating: symobj::trysubs

Error in sym/subs>mupadsubs (line 139)
G =
mupadmex('symobj::fullsubs',F.s,X2,Y2);

Error in sym/subs (line 124)
G = mupadsubs(F,X,Y);

Error in Flow_Streamlines (line 18)
Y = subs(solve(eqn,y),x,X); %Explicit
streamline expression for Y.

那么,应该如何做到这一点呢?

因为您多次使用
subs
matlabFunction
更有效。您可以使用
C
作为参数,并根据
x
C
求解
y
。然后,for
循环的
速度要快得多:

syms x y

K = 5; %Constant.

u = K*x; %Velocity component in x direction.
v = -K*y; %Velocity component in y direction.

A = int(1/u,x); %First integral.
B = int(1/v,y); %Second integral.

X = -1:0.1:1; %Array of x values for plotting.

syms C % C is treated as a parameter
eqn = A == B + C; %Solved streamline equation.

% Now solve the eqn for y, and make it into a function of `x` and `C`
Y=matlabFunction(solve(eqn,y),'vars',{'x','C'})

for C = -10:0.1:10; %Loop. C is assigned a different value in each iteration.
    plot(X,Y(X,C)); %Standard plot call, but using the function for `Y`
    hold on;
end

你能发布你得到的错误吗?@Hwathanie是的,我已经编辑了添加错误消息的帖子。我的答案只给出了
x
y
具有相同符号的解,我不太清楚从何处获得Matlab来给出其他解,但你可以用
绘图(x,y(x,C),x,-y(x,C))在循环中。谢谢@David的回答,它解决了我的问题。