Cranck-Nicolson隐式方法解线性双曲型方程

devtools/2024/9/24 4:19:38/

Cranck-Nicolson隐式方法解线性双曲型方程
Cranck-Nicolson方法在抛物型方程里面比较常用,双曲型方程例子不多,该方法是二阶精度,无条件稳定,然而,数值震荡比较明显,特别是时间演化比较大以及courant数比较大的时候。
对于这类方程的隐式解法,系数矩阵是三对角矩阵,每次固定时间t,通过解方程的方法解出来下一个时间步上的函数值,比如X方向分了N个格点,去掉边界条件,每个时间步N-2个未知数,构成三对角矩阵。如果采用追赶法求解,courant数需要小于2
网上的例子不多,我这里写了一下,供大家参考
在这里插入图片描述
CN方法离散成差分方程组,注意对于边界条件旁边的未知数边界项需要移动到等式右边
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
这里外边界直接采用精确解作为边界条件

python">import matplotlib
import math
matplotlib.use('TkAgg')
import numpy as np  
import matplotlib.pyplot as pltdef catchup(n,a0,b0,c0,F0):             #输入三个对角线上的值a,b,c,F0是等号右边的向量
#注意,追赶法要求:|b1|>|c1|,|bn|>|an|, |bi|>|ai|+|ci|m = np.zeros(F0.size, dtype=float)#中间变量xx = np.zeros(F0.size, dtype=float)for i in range(1, n): #正序,追m[i] = a0[i]/b0[i-1]#          a0是左副对角线,c0是右副对角线b0[i] = np.copy(b0[i]) - m[i]*c0[i-1]#b是主对角线F0[i] = np.copy(F0[i]) - m[i]*F0[i-1]xx[-1] = F0[-1]/b0[-1]for j in range (n-2, -1, -1):#倒序,赶xx[j] = (F0[j]-c0[j]*xx[j+1])/b0[j]return xxdef CN(x,t,a0,u):#Cranck-Nicolson格式n = (x.size-2)#  x方向未知数数量,x方向有两个边界作为已知条件,因此未知数是格点数-2m = t.size-1   #t方向未知数量,t方向未知数-1courant = a0*(t[2]-t[1])/(x[2]-x[1])#courant数,虽然CN算法对courant数没有限制,但追赶法有限制if courant > 2:print('courant number is too large',courant )#由于追赶法要求三条对角线|bi|>|ai|+|ci|,对应从courant<2print('courant=',courant)b = np.zeros(n, dtype=float)#方程组的系数矩阵,b是主对角线,ac是两条副对角线,这是一个三对角矩阵a = np.zeros(n, dtype=float)c = np.zeros(n, dtype=float)f = np.zeros(n, dtype=float)#差分方程等号的右边,和对角线上元素数量一致for j in range (0,m):for i in range(0,n): #对三条对角线分别赋值,对方程组等号右边f也赋值,注意第一行和最后一行需要额外+-courant/4.*u[m+1,0]b[i] = 1.#     主对角线if i >0:   a[i] = -1.*courant/4.if i<(n-1):c[i] =courant/4.f[i] = u[j,i+1]-courant/4.*(u[j,i+2]-u[j,i])'''#这里是系数矩阵,实际上不需要,可以打印出来看一下A = np.zeros((n,n),dtype=float)for i in range(0,n):         A[i,i] = 1.#     主对角线if i >0:A[i-1,i] = -1.*courant/2.if i<(n-1):A[i,i+1] =courant/2.f[i] = u[j,i+1]-courant/4.*(u[j,i+2]-u[j,i])f[0] = np.copy(f[0])+courant/4.*u[j+1,0]f[-1] = np.copy(f[-1])-courant/4.*u[j+1,-1]aa,bb,cc,=get_tridiagonal2(A,f)dd=np.copy(f)'''#u[m+1,-1] = u[m,-1]#+((t[2]-t[1])/(x[2]-x[1]))*(u[m,-1]-u[m,-2])f[0] =  u[j,1]-courant/4.*(u[j,2]-u[j,0])+courant/4.*u[j+1,0]#对方程组等号右边f首元素单独赋值(见公式)f[-1] = np.copy(f[-1])-courant/4.*u[j+1,-1]#对方程组等号右边f末元素单独赋值(见公式)result = catchup(n, a, b, c, f)#采用追赶法,只需输入三条对角线和方程右边u[j+1, 1:(result.size+1)] = np.copy(result)return udef plot(x, t, result):plt.figure()plt.plot(x, result[-1,:])plt.show()plt.close()plt.figure()plt.contourf(x, t, result, 50, cmap = 'jet')plt.colorbar()plt.savefig('CN.png')plt.show()plt.close()return 0#初始化
a0 = 250.
x = np.linspace(0., 400., 200)
t = np.linspace(0., 0.5, 200)u = np.zeros((t.size,x.size), dtype=float)
u[0,:] = 100.*np.cos(math.pi*x/60.)
u[:,0] = 100.*np.cos(math.pi*(0.- a0*t)/60.)#100.*np.cos(-1.*math.pi*a0*t/60.)
u[:,-1] = 100.*np.cos(math.pi*(x[-1] - a0*t)/60.)result = CN(x, t, a0, u)plot(x, t, result)

在这里插入图片描述


http://www.ppmy.cn/devtools/22210.html

相关文章

flutter 使用xcodebuild 命令打包ipa

苹果打ipa包(注意苹果打包需要连接真机) 方式一、 1. 先执行 flutter build ios 生成framework 2. 执行命令 xcodebuild -exportArchive -archivePath build/ios/Runner.xcarchive -exportOptionsPlist exportOptions.plist -exportPath build/ios/ipa exportOptions.plist …

【Spring Security系列】Spring Security整合JWT:构建安全的Web应用

前言 在企业级开发或者我们自己的课程设计中&#xff0c;确保用户数据的安全性和访问控制非常重要。而Spring Security和JWT是都两个强大的工具&#xff0c;它俩结合可以帮助我们实现这一目标。 Spring Security提供了全面的安全功能&#xff0c;而JWT则是一种用于身份验证的…

【JavaScriptThreejs】判断路径在二维平面上投影的方向顺逆时针

原理分析 可以将路径每个连续的两点向量叉乘相加&#xff0c;根据正负性判断路径顺逆时针性 当我们计算两个向量的叉积时&#xff0c;结果是一个新的向量&#xff0c;其方向垂直于这两个向量所在的平面&#xff0c;并且其大小与这两个向量构成的平行四边形的面积成正比。这个新…

python笔记:gensim进行LDA

理论部分&#xff1a;NLP 笔记&#xff1a;Latent Dirichlet Allocation &#xff08;介绍篇&#xff09;-CSDN博客 参考内容&#xff1a;DengYangyong/LDA_gensim: 用gensim训练LDA模型&#xff0c;进行新闻文本主题分析 (github.com) 1 导入库 import jieba,os,re from ge…

什么?你还不懂文件系统和软硬链接?

文章目录 序言认识磁盘磁盘在系统中的管理熟悉磁盘各个分区 软硬链接软链接硬链接 序言 首先熟悉一下一些专有名词(了解即可,但必须有一个概念认识) 固态:SSD,笔记本中常装的,台式机中也可以装,常见的对应接口M.2和SATA接口 磁盘:90年代常用的数据存储设备,或是现在企业级数据…

PotatoPie 4.0 实验教程(23) —— FPGA实现摄像头图像伽马(Gamma)变换

为什么要进行Gamma校正 图像的 gamma 校正是一种图像处理技术&#xff0c;用于调整图像的亮度和对比度&#xff0c;让显示设备显示的亮度和对比度更符合人眼的感知。Gamma 校正主要用于修正显示设备的非线性响应&#xff0c;以及在图像处理中进行色彩校正和图像增强。 以前&am…

Paddle OCR v4 微调训练文字识别SVTRNet模型实践

文字识别步骤参考&#xff1a;https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/recognition.md 微调步骤参考:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7.1/doc/doc_ch/finetune.md 训练必要性 原始模型标点符号和括号容易识别不到 数据…

IPD项目管理体系的建立以及项目管理软件如何助力IPD高效落地

市场竞争的加剧与客户需求的多样性&#xff0c;传统的研发管理模式已无法满足企业发展的进程&#xff0c;IPD作为一种先进的研发管理思想与方法已被更多的企业所采用&#xff0c;用以提高研发效率。建立一个高效的IPD流程管理体系对于企业的发展至关重要。 接下来&#xff0c;…