在 Matlab 中使用标准绘图函数绘制符号方程
Plot symbolic equation using standard plot function in Matlab
为了获得流体行为的图形表示,通常的做法是绘制其流线图。
对于给定的二维流体,其速度分量为 u = Kx 和 v = -Ky(其中 K 为常数,例如:K = 5),对流速场分量进行积分得到流线方程为:
流线方程:∫dx/u = ∫dy/v
求解的方程如下所示:A = B + C(其中 A 是第一个积分的解,B 是第二个积分的解,C 是积分常数)。
一旦我们做到了这一点,我们就可以通过简单地为 C 赋值来开始绘制流线图,例如:C = 1,然后绘制生成的方程式。这将生成一个流线,因此为了获得更多流线,您需要迭代最后一步,每次都分配不同的 C 值。
通过让 matlab integrate 符号化方程并使用 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
不够准确并且不能很好地处理奇点(渐近线等)。这就是为什么标准 "numeric" plot
似乎是可取的,以获得更好的视觉输出。
这里的挑战是将符号流线解转换为与标准 plot
函数兼容的显式表达式。
我试过这样做,使用 subs
和 solve
完全没有成功(Matlab 抛出错误)。
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.
for C = -10:0.1:10; %Loop. C is assigned a different value in each iteration.
eqn = A == B + C; %Solved streamline equation.
Y = subs(solve(eqn,y),x,X); %Explicit streamline expression for Y.
plot(X,Y); %Standard plot call.
hold on;
end
这是命令 window:
上显示的错误
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
为了获得流体行为的图形表示,通常的做法是绘制其流线图。
对于给定的二维流体,其速度分量为 u = Kx 和 v = -Ky(其中 K 为常数,例如:K = 5),对流速场分量进行积分得到流线方程为:
流线方程:∫dx/u = ∫dy/v
求解的方程如下所示:A = B + C(其中 A 是第一个积分的解,B 是第二个积分的解,C 是积分常数)。
一旦我们做到了这一点,我们就可以通过简单地为 C 赋值来开始绘制流线图,例如:C = 1,然后绘制生成的方程式。这将生成一个流线,因此为了获得更多流线,您需要迭代最后一步,每次都分配不同的 C 值。
通过让 matlab integrate 符号化方程并使用 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
不够准确并且不能很好地处理奇点(渐近线等)。这就是为什么标准 "numeric" plot
似乎是可取的,以获得更好的视觉输出。
这里的挑战是将符号流线解转换为与标准 plot
函数兼容的显式表达式。
我试过这样做,使用 subs
和 solve
完全没有成功(Matlab 抛出错误)。
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.
for C = -10:0.1:10; %Loop. C is assigned a different value in each iteration.
eqn = A == B + C; %Solved streamline equation.
Y = subs(solve(eqn,y),x,X); %Explicit streamline expression for Y.
plot(X,Y); %Standard plot call.
hold on;
end
这是命令 window:
上显示的错误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