有限差分法解泊松方程

更新:代码中ii和jj的顺序反了

import numpy as np
from matplotlib import pyplot as plt
from scipy.sparse import diags, lil_matrix
from scipy.sparse.linalg import spsolve
def FDM_poison(div_f, x, y):
    ii, jj = div_f.shape
    ii2 = ii - 2
    jj2 = jj - 2

    hx = np.mean(x[1:]-x[:-1])
    hy = np.mean(y[1:]-y[:-1]) 
    print('hx=', hx, 'hy=', hy)

    A = lil_matrix((ii2 * jj2, ii2 * jj2))

    diagonals = [2 * (1/hx**2 + 1/hy**2) * np.ones(jj2),
            -1/hy**2 * np.ones(jj2-1),
            -1/hy**2 * np.ones(jj2-1)]
    Dmatrix = diags(diagonals, [0, 1, -1])

    for k in range(ii2):
        p = slice(k * jj2, (k + 1) * jj2)
        A[p, p] = Dmatrix
        if k < ii2 - 1:
            next_p = slice((k + 1) * jj2, (k + 2) * jj2)
            A[p, next_p] = diags([-1/hx**2 * np.ones(jj2)], [0])
            A[next_p, p] = diags([-1/hx**2 * np.ones(jj2)], [0])

    A =
### Matlab 中使用有限差分法泊松方程 在Matlab中,通过有限差分法(FDM)求泊松方程是一个常见的数值方法。这种方法的核心在于将连续的空间离散化成网格点,在这些点上近似原微分方程中的导数项[^2]。 对于二维区域内的泊松方程 \(-\nabla^2u=f(x,y)\),其中 \(f\) 是已知源项,\(u\) 是待求未知量,则可以在矩形区域内定义均匀分布的网格节点,并采用中心差商代替二阶偏导数: \[ u_{xx} ≈ \frac{u(i+1,j)-2u(i,j)+u(i-1,j)}{\Delta x^2}, \] \[ u_{yy} ≈ \frac{u(i,j+1)-2u(i,j)+u(i,j-1)}{\Delta y^2}. \] 由此构建线性方程组并求之。下面给出一段简单的Matlab代码示例来展示如何具体实施此过程。 ```matlab % 定义参数 Lx = 1; % X方向长度 Ly = 1; % Y方向长度 nx = 50; ny=nx; dx=Lx/(nx-1); dy=Ly/(ny-1); [X,Y]=meshgrid(linspace(0,Ly,ny),linspace(0,Lx,nx)); % 初始化条件设置 b=zeros(nx*ny,1); A=sparse(nx*ny,nx*ny); for i=2:nx-1 for j=2:ny-1 idx=(i-1)*ny+j; b(idx)=sin(pi*X(i,j))*sin(pi*Y(i,j)); % 右端项 A(idx,idx)=4/dx^2+4/dy^2; if i>1,A(idx,idx-ny)=-1/dx^2;end if i<nx,A(idx,idx+ny)=-1/dx^2;end if j>1,A(idx,idx-1)=-1/dy^2;end if j<ny,A(idx,idx+1)=-1/dy^2;end end end % 边界处理(这里假设边界值为零) U=A\b; % 将一维向量转换回二维矩阵形式以便可视化 U=reshape(U,[nx,ny]); surf(X,Y,U,'EdgeColor','none') xlabel('X轴'); ylabel('Y轴'); title('泊松方程数值'); colorbar; ``` 这段脚本实现了对给定边界的简单情况下的泊松方程,并展示了最终的结果作为表面图。当然实际应用场景可能会更加复杂,涉及到不同的边界条件或者其他类型的源项等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值