首页 文章

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

提问于
浏览
3

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

对于具有速度分量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 函数兼容的显式表达式 .

我试图这样做,使用 subssolve 完全没有成功(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

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

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.

那么,应该怎么做呢?

1 回答

  • 0

    由于您多次使用 subs ,因此 matlabFunction 效率更高 . 您可以使用 C 作为参数,并根据 xC 求解 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
    

相关问题