NS方程由精确解求源项matlab代码

有时候在NS方程中我们需要构造有精确解的例子去测试格式的精度,这时候往往都是先给出精确解的表达式,然后带入原NS方程求出源项。如何求这个源项呢,对于可压流NS方程来说手动求导数会很麻烦。所以,这里我们用matlab符号计算来求源项。

clear all
syms x y u1 u2 u3 u4 pressure gamma txx txy tyx tyy mu Pr kTx kTy
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%各变量定义%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%x x方向坐标
%y y方向坐标
%u1 密度
%u2 x方向动量
%u3 y方向动量
%u4 总能
%pressure 压强
%gamma 气体常数
%txx txy tyx tyy 粘性应力张量
%mu 粘性系数
%Pr Prandtl数
%kTx $\kappa T_x$
%kTy $\kappa T_y$
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
u1 = sin(2*(x+y)) + 4; 
u2 = sin(2*(x+y)) + 4;
u3 = sin(2*(x+y)) + 4;
u4 = (sin(2*(x+y)) + 4)^2;

pressure = (gamma - 1)*(u4 - 0.5*(u2^2+u3^2)/u1);
txx = 2.0/3.0 * mu * (2*diff(u2/u1,x)-diff(u3/u1,y));
txy = mu*(diff(u2/u1,y)+diff(u3/u1,x));
tyx = mu*(diff(u3/u1,x)+diff(u2/u1,y));
tyy = 2.0/3.0*mu*(2*diff(u3/u1,y)-diff(u2/u1,x));
kT = mu * gamma / Pr *(u4/u1-0.5*(u2^2+u3^2)/(u1*u1));
kTx = diff(kT,x);
kTy = diff(kT,y);

f1x = u2;
f1y = u3;
g1x = 0;
g1y = 0;

f2x = u2^2/u1 + pressure;
f2y = u2*u3/u1;
g2x = txx;
g2y = txy;

f3x = u2*u3/u1;
f3y = u3^2/u1 + pressure;
g3x = txy;
g3y = tyy;

f4x = u2/u1*(u4+pressure);
f4y = u3/u1*(u4+pressure);
g4x = u2/u1*txx + u3/u1*txy + kTx;
g4y = u2/u1*txy + u3/u1*tyy + kTy;

d1 = diff(f1x,x) + diff(f1y,y) - diff(g1x,x) - diff(g1y,y);
d2 = diff(f2x,x) + diff(f2y,y) - diff(g2x,x) - diff(g2y,y);
d3 = diff(f3x,x) + diff(f3y,y) - diff(g3x,x) - diff(g3y,y);
d4 = diff(f4x,x) + diff(f4y,y) - diff(g4x,x) - diff(g4y,y);

d1 = simplify(d1)
d2 = simplify(d2)
d3 = simplify(d3)
d4 = simplify(d4)

转载于:https://www.cnblogs.com/yuehq/p/5411957.html

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Navier-Stokes方程组是描述不可压缩流体运动的基本方程组,在流体力学中得到了广泛应用。在MATLAB中,可以借助有限元或有限差分算法来求解NS方程,其代码如下: % 定义参数 L = 10; W = 10; rho = 1; mu = 1; u_top = 1; delta_t = 0.001; delta_x = 0.1; delta_y = 0.1; nt = 100; % 初始化变量 u = zeros(Nx,Ny); v = zeros(Nx,Ny); p = zeros(Nx,Ny); b = zeros(Nx,Ny); % 在每个时间步骤中迭代 for n = 1:nt % 执行步骤1:计算b的值 for i = 2:nx-1 for j = 2:ny-1 b(i,j) = rho*(1/delta_t * ((u(i,j+1)-u(i,j-1))/(2*delta_y) + (v(i+1,j)-v(i-1,j))/(2*delta_x)) - ((u(i,j+1)-u(i,j-1))/(2*delta_y))^2 - 2*((u(i+1,j)-u(i-1,j))/(2*delta_x)*(v(i,j+1)-v(i,j-1))/(2*delta_y)) - ((v(i+1)-v(i-1))/(2*delta_x))^2); end end % 执行步骤2:计算p的值 for i = 2:Nx-1 for j = 2:ny-1 p(i,j) = ((p(i,j+1)+p(i,j-1))*delta_x^2 + (p(i+1,j)+p(i-1,j))*delta_y^2 - b(i,j)*delta_x^2*delta_y^2)/(2*(delta_x^2+delta_y^2)); end end % 执行步骤3:计算u和v的值 u(2:end-1,2:end-1) = u(2:end-1,2:end-1) - delta_t/rho * (p(2:end-1,3:end) - p(2:end-1,1:end-2))/(2*delta_y) - u(2:end-1,2:end-1) * (delta_t/delta_x) .* (u(2:end-1,2:end-1) - u(2:end-1,1:end-2)) - v(2:end-1,2:end-1) * (delta_t/delta_y) .* (u(2:end-1,2:end-1) - u(1:end-2,2:end-1)); v(2:end-1,2:end-1) = v(2:end-1,2:end-1) - delta_t/rho * (p(3:end,2:end-1) - p(1:end-2,2:end-1))/(2*delta_x) - u(2:end-1,2:end-1) * (delta_t/delta_x) .* (v(2:end-1,2:end-1) - v(2:end-1,1:end-2)) - v(2:end-1,2:end-1) * (delta_t/delta_y) .* (v(2:end-1,2:end-1) - v(1:end-2,2:end-1)); % 处理上边界条件 u(1,:) = u_top; v(1,:) = 0; v(:,1) = 0; u(end,:) = 0; v(:,end) = 0; end 通过以上代码,可以得到NS方程的数值解,在计算流体运动等问题时,具有一定的适用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值