php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 540|回复: 0

差分法求解泊松方程python程序

[复制链接]

3146

主题

3156

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7966
贡献
0
注册时间
2021-4-14
最后登录
2024-11-23
在线时间
763 小时
QQ
发表于 2022-7-1 13:07:06 | 显示全部楼层 |阅读模式
from numpy import *
import matplotlib.pyplot as plt

M, N = 100, 100
a, b = 1, 1
hx, hy = a / M, b / N
p, q = 1 / hx ** 2, 1 / hy ** 2
r = -2 * (p + q)

U = zeros((M - 1, M - 1))
for i in range(M - 1):
    U[i, i] = r
    if i < M - 2: U[i, i + 1] = p
    if i > 0:   U[i, i - 1] = p
V = diag([q] * (M - 1))
Zero_mat = zeros((M - 1, M - 1))

A_blc = empty((N - 1, N - 1), dtype=object)  # 矩阵A的分块形式
for i in range(N - 1):
    for j in range(N - 1):
        if i == j:
            A_blc[i, j] = U
        elif abs(i - j) == 1:
            A_blc[i, j] = V
        else:
            A_blc[i, j] = Zero_mat

A = vstack([hstack(A_i) for A_i in A_blc])  # 组装得到矩阵A

x_i = linspace(0, a, M + 1)
y_i = linspace(0, b, N + 1)
F = vstack([-2 * pi ** 2 * sin(pi * x_i[1:M].reshape((M - 1, 1)))
            * sin(pi * j) for j in y_i[1:N]])
u = dot(linalg.inv(A), F).reshape(M - 1, N - 1)
u_f = vstack([zeros((1, M + 1)),  # 最后组装边界条件得到全域的解
              hstack([zeros((N - 1, 1)), u, zeros((N - 1, 1))]),
              zeros((1, M + 1))])


fig = plt.figure()  # 定义画布大小
ax = fig.add_subplot(111, projection='3d')

Y = arange(0, shape(u)[0], 1) / shape(u)[0]
X = arange(0, shape(u)[1], 1) / shape(u)[1]
X, Y = meshgrid(X, Y)

surf = ax.plot_surface(X, Y, u, rstride=1, cstride=1, cmap='viridis', linewidth=0.4, antialiased=True)

ax.view_init(90, 180)  # 设置观察角度d
plt.show()

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-23 20:13 , Processed in 0.252167 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表