求解navier stokes方程进行流体仿真

求解Navier-Stokes方程是流体动力学中的一个核心问题,它描述了流体的运动。Navier-Stokes方程是一个复杂的偏微分方程组,通常需要借助数值方法进行求解。MATLAB的简单示例,展示如何使用有限差分法求解二维不可压缩流体的Navier-Stokes方程。

对于二维不可压缩流体,Navier-Stokes方程可以表示为:

\(\begin{aligned} &\frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} + v \frac{\partial u}{\partial y} = -\frac{1}{\rho} \frac{\partial p}{\partial x} + \nu \left( \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} \right) \\ &\frac{\partial v}{\partial t} + u \frac{\partial v}{\partial x} + v \frac{\partial v}{\partial y} = -\frac{1}{\rho} \frac{\partial p}{\partial y} + \nu \left( \frac{\partial^2 v}{\partial x^2} + \frac{\partial^2 v}{\partial y^2} \right) \\ &\frac{\partial u}{\partial x} + \frac{\partial v}{\partial y} = 0 \end{aligned}\)

其中:

  • \(u\)\(v\) 分别是 \(x\)\(y\) 方向的速度分量。
  • \(p\) 是压力。
  • \(\rho\) 是流体密度。
  • \(\nu\) 是动力粘度。

代码

使用有限差分法求解二维不可压缩流体的Navier-Stokes方程。

% 清空环境
clc;
clear;
close all;

% 参数设置
Lx = 2; % x方向长度
Ly = 2; % y方向长度
Nx = 41; % x方向网格点数
Ny = 41; % y方向网格点数
dx = Lx / (Nx - 1); % x方向网格间距
dy = Ly / (Ny - 1); % y方向网格间距
dt = 0.001; % 时间步长
rho = 1; % 密度
nu = 0.1; % 动力粘度
nt = 100; % 时间步数

% 初始化速度和压力
u = zeros(Ny, Nx);
v = zeros(Ny, Nx);
p = zeros(Ny, Nx);

% 边界条件
u(:, 1) = 1; % 左边界
u(:, end) = 0; % 右边界
v(:, 1) = 0; % 左边界
v(:, end) = 0; % 右边界

% 时间步进
for n = 1:nt
    % 计算速度的时间导数
    un = u;
    vn = v;
    b = zeros(Ny, Nx);
    for i = 2:Nx-1
        for j = 2:Ny-1
            b(j, i) = (rho * (1 / dt * ((un(j, i + 1) - un(j, i)) / dx + (vn(j + 1, i) - vn(j, i)) / dy) ...
                - ((un(j, i + 1) - un(j, i - 1)) / (2 * dx)) * ((un(j, i + 1) - un(j, i - 1)) / (2 * dx)) ...
                - 2 * ((un(j, i + 1) - un(j, i - 1)) / (2 * dx) * (vn(j + 1, i) - vn(j - 1, i)) / (2 * dy)) ...
                - ((vn(j + 1, i) - vn(j - 1, i)) / (2 * dy)) * ((vn(j + 1, i) - vn(j - 1, i)) / (2 * dy))));
        end
    end

    % 解泊松方程求压力
    p = poisson_solver(b, dx, dy, rho, dt);

    % 更新速度
    for i = 2:Nx-1
        for j = 2:Ny-1
            u(j, i) = un(j, i) - un(j, i) * dt / dx * (un(j, i) - un(j, i - 1)) ...
                - vn(j, i) * dt / dy * (un(j, i) - un(j - 1, i)) ...
                - dt / (2 * rho * dx) * (p(j, i + 1) - p(j, i - 1)) ...
                + nu * (dt / dx^2 * (un(j, i + 1) - 2 * un(j, i) + un(j, i - 1)) ...
                + dt / dy^2 * (un(j + 1, i) - 2 * un(j, i) + un(j - 1, i)));
            v(j, i) = vn(j, i) - un(j, i) * dt / dx * (vn(j, i) - vn(j, i - 1)) ...
                - vn(j, i) * dt / dy * (vn(j, i) - vn(j - 1, i)) ...
                - dt / (2 * rho * dy) * (p(j + 1, i) - p(j - 1, i)) ...
                + nu * (dt / dx^2 * (vn(j, i + 1) - 2 * vn(j, i) + vn(j, i - 1)) ...
                + dt / dy^2 * (vn(j + 1, i) - 2 * vn(j, i) + vn(j - 1, i)));
        end
    end

    % 应用边界条件
    u(:, 1) = 1; % 左边界
    u(:, end) = 0; % 右边界
    v(:, 1) = 0; % 左边界
    v(:, end) = 0; % 右边界
end

% 绘制结果
figure;
subplot(1, 2, 1);
contourf(u);
title('速度场 u');
colorbar;

subplot(1, 2, 2);
contourf(v);
title('速度场 v');
colorbar;

参考代码 求解navier stokes方程进行流体仿真 youwenfan.com/contentcsc/83298.html

说明

  1. 参数设置

    • 定义了流体的物理参数(如密度、粘度)和数值参数(如网格间距、时间步长)。
  2. 初始化速度和压力

    • 初始化速度和压力场,并设置边界条件。
  3. 时间步进

    • 使用有限差分法计算速度的时间导数,并通过泊松方程求解压力。
  4. 泊松方程求解

    • 使用一个简单的泊松方程求解器(如poisson_solver函数)来求解压力场。
  5. 更新速度

    • 根据Navier-Stokes方程更新速度场。
  6. 结果绘制

    • 使用contourf函数绘制速度场的等高线图。
posted @ 2025-08-11 16:03  别说我的眼泪有点咸  阅读(49)  评论(0)    收藏  举报