二维Poisson方程五点差分格式与Python实现

news2024/11/19 10:27:44
  • 最近没怎么写新文章,主要在学抽象代数
  • 下学期还有凸分析
  • 好累的一学期
  • 哦对,我不是数学系的,我是物理系的。而且博主需要澄清一下,博主没有对象,至少现在还没有。


  • 好,兄弟们,好习惯,先上代码后说话!

Python 实现

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import scipy.sparse as ss
from scipy.sparse.linalg import spsolve

class PDE2DModel:
    #均应该传入一个一维二元数组,表示起止值
    def __init__(self,x,y):
        assert len(x)==len(y)==2,"ERROR:UNEXPECTED SV and EV!!"
        self.x = x
        self.y = y

    #hx表示X上的步长
    #hy表示Y上的步长
    def space_grid(self,hx,hy):
        M = int(round((self.x[1]-self.x[0])/hx,0))
        N = int(round((self.y[1]-self.y[0])/hy,0))
        assert M==N>=3,"至少网格数是合理的"
        X = np.linspace(self.x[0],self.x[1],M+1)
        Y = np.linspace(self.y[0],self.y[1],N+1)
        return M,N,X,Y

    def f(self,X,Y):
        return 6*X*Y**3+6*X**3*Y+np.e**X*np.sin(Y)-np.e**X*np.sin(Y)

    def solution(self,X,Y):
        return np.e**X*np.sin(Y)-X**3*Y**3

    #左边界
    def left(self,Y):
        return np.sin(Y)
    #右边界
    def right(self,Y):
        return np.e**3*np.sin(Y)-27*Y**3
    #上边界
    def up(self,X):
        return np.sin(1)*np.e**X-X**3
    #下边界
    def down(self,X):
        return 0*X

#解算核心
def NDM5_2D(PDE2DModel,hx,hy):
    M,N,X0,Y0 = PDE2DModel.space_grid(hx,hy)
    Y,X = np.meshgrid(Y0,X0)
##    print("X0",X0)
##    print("Y0",Y0)
##    #数值结果保存在U中 从0到N共N+1个
##    print("M",M)
##    print("N",N)
    U = np.zeros((M+1,N+1))
    U[0,:]  = PDE2DModel.left(Y0)
    U[-1,:] = PDE2DModel.right(Y0)
    U[:,0]  = PDE2DModel.down(X0)
    U[:,-1] = PDE2DModel.up(X0)

    D = np.diag([-1/(hy**2) for i in range(M-1)])
    C = np.zeros((N-1,N-1),dtype="float64")
    for i in range(N-1):
        C[i][i] = 2*(1/hx**2+1/hy**2)
        if i<N-2:
            C[i][i+1] = -1/hx**2
            C[i+1][i] = -1/hx**2


    u0 = np.array([[PDE2DModel.down(X0[i])] for i in range(1,M)])
    un = np.array([[PDE2DModel.up(X0[i])] for i in range(1,M)])
    
    F = np.zeros((M-1)*(N-1)) 
    for j in range(1,N):
        #for i in range(1,M):
        F[(N-1)*(j-1):(N-1)*(j)] = PDE2DModel.f(X0[1:M],np.array([Y0[j] for i in range(N-1)]))

        F[(N-1)*(j-1)] += PDE2DModel.left(Y0[j])/hx**2
        F[(N-1)*(j)-1] += PDE2DModel.right(Y0[j])/hx**2

    F[:N-1] -= np.dot(D,u0).T[0]
    F[(M-1)*(N-2):] -= np.dot(D,un).T[0]
    F = np.mat(F).T
##    print(F)

    Dnew = np.zeros(((M-1)*(N-1),(N-1)*(M-1)))
    for i in range((N-1)*(N-1)):
        Dnew[i][i] = 2*(1/hx**2+1/hy**2)

        if i<(N-2)*(N-1):
            Dnew[i][i+N-1] = -1/hy**2
            Dnew[i+N-1][i] = -1/hy**2

    for i in range(N-1):
        for j in range(N-2):
            Dnew[(N-1)*i+j][(N-1)*i+j+1] = -1/hx**2
            Dnew[(N-1)*i+j+1][(N-1)*i+j] = -1/hx**2

    print("差分方程构造完成!解算开始!")  
    Unew = np.linalg.solve(Dnew,F)
    #print(Unew)
    U[1:-1,1:-1] = Unew[:,0].reshape((N-1,N-1)).T
    return X,Y,U

#数据可视化
def Visualized():
    x = np.array([0,3])
    y = np.array([0,1])

    pde = PDE2DModel(x,y)
    X,Y,U = NDM5_2D(pde,0.03,0.01)
    u = pde.solution(X,Y)

    print("解算完成!绘图已开始!")
    plt.figure(figsize=(15,5))
    ax1 = plt.subplot(131,projection="3d")
    ax2 = plt.subplot(132,projection="3d")
    ax3 = plt.subplot(133,projection="3d")

    ax1.set_title("Numeric Solution")
    ax1.set_xlabel("x")
    ax1.set_ylabel("y")
    ax1.plot_surface(X,Y,U,cmap="gist_ncar")

    ax2.set_title("Exact Solution")
    ax2.set_xlabel("x")
    ax2.set_ylabel("y")
    ax2.plot_surface(X,Y,u,cmap="gist_ncar")

    e = np.abs(U-u)
    ax3.set_title("Error")
    ax3.set_xlabel("x")
    ax3.set_ylabel("y")
    ax3.plot_surface(X,Y,e,cmap="gist_ncar")

    plt.show()
    return U,u,X,Y

U,u,X,Y = Visualized()

  • 好习惯2,效果图

很好,接下去接着讲

五点差分格式

  •  这里我要用截图,截的我的小论文.没办法,CSDN写作太麻烦了,没有Latex好用.我记得这个好像可以调整,但我没学会

 

 很好,结束了.

注意事项

  • 你在写代码的时候,容易犯几个错误.
  • 在纸上图画出来了,然后呢,纸上是右手系,写进数组了,就忘了是啥系了!
  • 比如:
    Y,X = np.meshgrid(Y0,X0)
  • 我们需要重点看一下np.meshgrid问题.这才是大家想要的数据结构.....
import numpy as np
x = np.array([1,2,3,4,5,6,7,8,9,10])
y = np.array([11,12,13,14,15,16,17,18,19,20])

Y,X = np.meshgrid(y,x)

  •  其实这个还涉及到稀疏矩阵的问题,稀疏矩阵解决不了的话,你的运算量会变得超大!一定要用系数矩阵优化才能解决问题!!

所以,优化之后!

用稀疏矩阵优化

import numpy as np
import scipy as sp
from scipy.sparse.linalg import spsolve
from scipy.sparse import csr_matrix,csc_matrix
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import scipy.sparse as ss
from scipy.sparse.linalg import spsolve
import  time

class PDE2DModel:
    def __init__(self):
        self.x = np.array([0,3])
        self.y = np.array([0,1])

    def space_grid(self,hx,hy):
        M = int(round((self.x[1]-self.x[0])/hx,0))
        N = int(round((self.y[1]-self.y[0])/hy,0))
        assert M==N>=3,"ERROR:UNECPECTED GRIDS M:"+str(M)+" N:"+str(N)
        X = np.linspace(self.x[0],self.x[1],M+1)
        Y = np.linspace(self.y[0],self.y[1],N+1)
        return M,N,X,Y

    def f(self,X,Y):
        return 6*X*Y**3+6*X**3*Y+np.e**X*np.sin(Y)-np.e**X*np.sin(Y)

    #左边界
    def left(self,Y):
        return np.sin(Y)
    #右边界
    def right(self,Y):
        return np.e**3*np.sin(Y)-27*Y**3
    #上边界
    def up(self,X):
        return np.sin(1)*np.e**X-X**3
    #下边界
    def down(self,X):
        return 0*X


def NDM5_2D(PDE2DModel,hx,hy):

    M,N,X0,Y0 = PDE2DModel.space_grid(hx,hy)
    Y,X = np.meshgrid(Y0,X0)

    U = np.zeros((M+1,N+1))
    U[0,:]  = PDE2DModel.left(Y0)
    U[-1,:] = PDE2DModel.right(Y0)
    U[:,0]  = PDE2DModel.down(X0)
    U[:,-1] = PDE2DModel.up(X0)

    D = np.diag([-1/(hy**2) for i in range(M-1)])
    C = np.zeros((N-1,N-1),dtype="float64")
    for i in range(N-1):
        C[i][i] = 2*(1/hx**2+1/hy**2)
        if i<N-2:
            C[i][i+1] = -1/hx**2
            C[i+1][i] = -1/hx**2

    u0 = np.array([[PDE2DModel.down(X0[i])] for i in range(1,M)])
    un = np.array([[PDE2DModel.up(X0[i])] for i in range(1,M)])
    
    F = np.zeros((M-1)*(N-1)) 
    for j in range(1,N):
        F[(N-1)*(j-1):(N-1)*(j)] = PDE2DModel.f(X0[1:M],np.array([Y0[j] for i in range(N-1)]))

        F[(N-1)*(j-1)] += PDE2DModel.left(Y0[j])/hx**2
        F[(N-1)*(j)-1] += PDE2DModel.right(Y0[j])/hx**2

    F[:N-1] -= np.dot(D,u0).T[0]
    F[(M-1)*(N-2):] -= np.dot(D,un).T[0]
    F = np.mat(F).T

    Dnew = np.zeros(((M-1)*(N-1),(N-1)*(M-1)))
    for i in range((N-1)*(N-1)):
        Dnew[i][i] = 2*(1/hx**2+1/hy**2)

        if i<(N-2)*(N-1):
            Dnew[i][i+N-1] = -1/hy**2
            Dnew[i+N-1][i] = -1/hy**2

    for i in range(N-1):
        for j in range(N-2):
            Dnew[(N-1)*i+j][(N-1)*i+j+1] = -1/hx**2
            Dnew[(N-1)*i+j+1][(N-1)*i+j] = -1/hx**2

    print("差分方程构造完成!解算开始!")
##    start = time.time()
##    Unew = np.linalg.solve(Dnew,F)
##    U[1:-1,1:-1] = Unew[:,0].reshape((N-1,N-1)).T
##    end = time.time()
##    t = end-start

    start = time.time()
    SDnew = csr_matrix(Dnew)
    SF = csr_matrix(F)
    SUnew = spsolve(SDnew,SF)
    U[1:-1,1:-1] = SUnew.reshape((N-1,N-1)).T
    end = time.time()
    t = end-start
    return X,Y,U,t

def Visualized(X,Y,U):

    print("解算完成!绘图已开始!")
    plt.figure(figsize=(15,5))
    ax1 = plt.subplot(111,projection="3d")
    ax1.set_title("Numeric Solution")
    ax1.set_xlabel("x")
    ax1.set_ylabel("y")
    ax1.plot_surface(X,Y,U,cmap="gist_ncar")
    plt.show()

pde = PDE2DModel()
X,Y,U,t = NDM5_2D(pde,0.03,0.01)
print(t)
Visualized(X,Y,U)

Python技巧

map

  • 水字数用,哥以后转战其他网站了.这个评分系统太恶心了.太恶心了.
  • 其实有个很有趣的现象.没考过计算机二级的人觉得二级Python弱爆了.一点用没有,备考计算机二级Python的人觉得难暴了.......
  • 挺好的,说不出话来......
  • 其实我个人认为非专业人士考一次计算机二级有助于学习的,还可以水创新学分.真是想不通哪个SX想出的创新学分.不是,这个人啊,他创新,创新这个是用指标逼出来的吗?
f = lambda x:x+5
X = [1,2,3,4,5]
map(f,X)
<map object at 0x00000246B5CE6110>
list(map(f,X))
[6, 7, 8, 9, 10]

Python自制警告

  • Python 自制警告是很有必要的.
  • 自制的警告与自制的错误不一样,不会打断程序运行(显然废话)
import warnings
a = 0
if a==0:
    warnings.warn("IGNORE!")
print(a+3)
Warning (from warnings module):
  File "C:\Users\LX\Desktop\新建 文本文档.py", line 34
    warnings.warn("IGNORE!")
UserWarning: IGNORE THIS WARNING!
3

Python matplotlib技巧

##import matplotlib
##import matplotlib.pyplot as plt
##from mpl_toolkits.mplot3d import Axes3D
##matplotlib.rcParams["font.sans-serif"] = ["SimHei"]
##matplotlib.rcParams["axes.unicode_minus"] = False
##
##import numpy as np
##
##x = np.linspace(1,2,6)
##y = np.linspace(3,9,13)
##Y,X = np.meshgrid(y,x)
##X2,Y2 = np.meshgrid(x,y)
##
##plt.figure(figsize=(15,5))
##ax1 = plt.subplot(121,projection="3d")
##ax2 = plt.subplot(122,projection="3d")
##
##ax1.set_title("Inverse order")
##ax2.set_title("Ordinary order")
##ax1.set_xlabel("x")
##ax2.set_xlabel("x")
##
##f = lambda x,y:x*2+y*3
##ax1.plot_surface(X,Y,f(X,Y))
##
##ax2.plot_surface(X2,Y2,f(X2,Y2))
##
##plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM鹊巢大连分公司分销商管理系统

开发工具(eclipse/idea/vscode等)&#xff1a;idea 数据库(sqlite/mysql/sqlserver等)&#xff1a;mysql 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;、主要功能 一、&#xff1a;人员管理&#xff1a;自己派遣到各个地区的员工&#xff0c;也就是分销商&#xf…

Java平衡树之红黑树代码实现过程详解(2)

红黑树 前面介绍了2-3树&#xff0c;可以看到2-3树能保证在插入元素之后&#xff0c;树依然保持平衡状态&#xff0c;它的最坏情况下所有子结点都是2-结点&#xff0c;树的高度为lgN,相比于我们普通的二叉查找树&#xff0c;最坏情况下树的高度为N&#xff0c;确实保证了最坏情…

药学专业转行软件测试,真的可以月薪过万吗?

转行原因 我在大学里学的是药学专业&#xff0c;毕业之后也顺利从事了对口的工作——药物分析。工作很稳定&#xff0c;但是内容很繁琐&#xff0c;薪资也一般&#xff0c;但从我自己内心来说从来没有开心过&#xff0c;因为我不想从事这样枯草并且一眼就可以看到老的人生。 …

常见的DDoS攻击方式和预防方法

DDoS攻击指分布式拒绝服务攻击&#xff0c;即处于不同位置的多个攻击者同时向一个或数个目标发动攻击&#xff0c;或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。以下是三种常见的DDoS攻击方式&#xff1a; 1.TCP洪水攻击&#xff08;SYN …

ADI Blackfin DSP处理器-BF533的开发详解65:JPEG解码(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了将 480*272 尺寸的 JPEG 数据解码为 RGB888 数据功能&#xff0c;调用了 JPEG 解码库函数。 JPEG 图像数据以.dat 文件…

FineReport报表工具制作图表-JS实现下拉框选择后复选框默认全选

1. 概述 1.1 预期效果 参数联动查询时&#xff0c;希望下拉框选择后&#xff0c;复选框可以跟着选中全部所有参数值&#xff0c;效果如下图所示&#xff1a; 1.2 实现思路 参数联动查询时&#xff0c;希望下拉框选择后&#xff0c;复选框可以跟着选中全部所有参数值给下拉框添…

六、http模块

HTTP —— 超文本传输协议&#xff0c;用于规范客户端浏览器和服务端以何种格式进行通信和数据交互&#xff1b;HTTP由请求和响应构成的&#xff0c;是一个标准的客服端服务器模型。 HTTP请求响应过程 先简单的来了解以下HTTP的请求响应过程&#xff1a;1.地址解析&#xff1a…

深度学习实验(四)——卷积神经网络编程

深度学习实验四:卷积神经网络编程 本次实验练习使用torch.nn中的类设计一个卷积神经网络进行MNIST手写体数字图像分类。 name x#填写你的姓名 sid B02014152#填写你的学号print(姓名:%s, 学号:%s%(name, sid))姓名:x, 学号:B02014152import torch import torch.nn as nn im…

完全背包问题(超级详细地讲解优化过程)

完全背包问题一、问题描述二、思路分析1、状态转移方程2、循环设计三、代码模板1、朴素版2、优化版&#xff08;1&#xff09;时间优化&#xff08;2&#xff09;空间优化一、问题描述 二、思路分析 完全背包和01背包的区别就在于01背包中&#xff0c;每个物品只能选择一次&am…

Java架构师大厂面试致命十连问,你接得住吗?

1.什么是缓存雪崩&#xff1f;怎么解决&#xff1f; ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 通常&#xff0c;我们会使用缓存用于缓冲对 DB 的冲击&#xff0c;如果缓存宕机&#xff0c;所有请求将直接打在 DB&#xff0c;造…

故事分享|27岁的Leader:要成为别人的灯塔,自己得先会“发光”

学习编程的年龄跨度很大&#xff0c;有还在读小学的10后小朋友&#xff0c;也有子孙满堂的八十岁老太太&#xff0c;但主力军&#xff0c;当属90后。 很多年前&#xff0c;90后还是许多人口中“垮掉的一代”。 许多年过去了&#xff0c;当90后逐渐摘掉不成熟的标签&#xff0…

ssh前置代理

ssh前置代理ssh前置代理Linux和mac配置ssh前置proxyUbuntu和mac的ncCentos的ncWindows的ssh前置proxyssh前置代理 适用于服务器无法直接连接过去,需要用proxy才可以连接的场景. Linux和mac配置ssh前置proxy nc属命令属于nmap-ncat包 Centos的nmap-ncat版本太低了,需要到https:…

学习笔记 - MapStruct 映射工具

学习笔记 - MapStruct 映射工具简介Maven 依赖实体类 Entity数据传输对象 DTO映射接口测试类IDEA 插件与 Lombok 一起使用参考资料简介 MapStruct是一个代码生成器&#xff0c;它基于约定优于配置的方法&#xff0c;极大地简化了Java bean类型之间映射的实现。 生成的映射代码使…

第8章 关系数据库设计

第8章 关系数据库设计 考试范围&#xff1a; 8.1-8.5&#xff0c;8.8&#xff0c;8.9 考试题型: 模式分解 考试内容&#xff1a; INF概念 非规范化设计的问题&#xff1a;数据冗余&#xff0c;插入/删除/更新异常 函数依赖的概念 平凡函数依赖 函数依赖集 最小(正则)覆…

数据结构和算法学习笔记之 03.单向双向链表和环形链表构建

5.单向链表 把一个节点Node当做是一个对象&#xff0c;改对象里面包含了数据和指向下一个节点的引用指针 5.1 链表的添加和遍历 5.1.1 思路分析 添加 创建一个head头节点表示链表的头节点&#xff0c;里面的存放数据的data null每添加一个元素就直接添加到链表的最后(尾插法…

Practise test day9

另类加法_牛客网 解题思路&#xff1a;位运算符 1 0001 2 0010 按位与&&#xff1a;如果两个二进制位都为1&#xff0c;则返回1&#xff0c;否则返回0 按位异或&#xff1a;两个二进制位相同返回0&#xff0c;不同返回1。 1.二进制位异或的结果&#xff0c;是两个数对应相加…

https-OPenSSL证书生成及自签名证书

目录 SSL/TLS 1、搭建OPenssl服务器 1.1、下载 1.2、安装下载好的exe程序 2、服务器端证书-生成key、CSR、CRT 2.1、进入如下目录&#xff0c;执行cmd 2.2、生成一个私钥key 2.3、由生成的私钥key生成一个待签名的CSR证书文件(公钥) 2.4、查看证书内容 3、自建CA证书 3.1…

跨境电商卖家如何创建客户参与的 Facebook 广告?

关键词&#xff1a;跨境电商卖家、客户参与、Facebook广告 想要从您的 Facebook 广告中获得更多潜在客户或转化&#xff1f;正在寻找为您自己的广告建模的成功秘诀&#xff1f; 在本文中&#xff0c;您将了解创建消费者响应的 Facebook 广告的八个技巧。 将您现有的 Facebook 受…

零基础能否转行做程序员,那些半路出家的程序员大神给你做了榜样

这些年&#xff0c;随着中国互联网产业的高速发展&#xff0c;对程序员这个职业的需求越来越大。而相对较高的薪水、简单的人际关系、入行不需要靠拼爹这些优点&#xff0c;也让越来越多的年轻人选择了这个职业。甚至很多本来已经从事了其他行业的年轻人&#xff0c;也都想转行…

Promise(三) promise自定义封装25-35

1.初始结构搭建 2.resolve和reject结构搭建 3.throw抛出异常改变状态 4.promise对象状态只能修改一次 5.then方法执行回调 6.指定多个回调的实现 7.同步修改状态then方法结果返回 8.异步修改状态then方法结果返回 9.then方法完善与优化 10.catch方法——异常穿透与值管…