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

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

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

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.mzph.cn/bicheng/4538.shtml

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

相关文章

网工内推 | 云计算运维,厂商云相关认证优先,股票期权,全勤奖

01 国科科技 招聘岗位&#xff1a;云计算运维 职责描述&#xff1a; 1、负责私有云平台的运维管理工作,包括云平台日常运维、故障处理、扩容、版本升级、优化和维护等。 2、根据业务需求,从技术角度支持及配合各业务系统上云工作。 3、为云上业务系统提供云产品、云服务方面的…

python ERA5 画水汽通量散度图地图:风速风向矢量图、叠加等高线、色彩分级、添加shp文件、添加位置点及备注

动机 有个同事吧&#xff0c;写论文&#xff0c;让我帮忙出个图&#xff0c;就写了个代码&#xff0c;然后我的博客好久没更新了&#xff0c;就顺便贴上来了&#xff01; 很多人感兴趣风速的箭头怎样画&#xff0c;可能这种图使用 NCL 非常容易&#xff0c;很多没用过代码的小…

【idea】idea 中 git 分支多个提交合并一个提交到新的分支

一、方法原理讲解 我们在 dev 分支对不同的代码文件做了多次提交。现在我们想要把这些提交都合并到 test 分支。首先我们要明白四个 git 操作&#xff0c; commit&#xff1a;命令用于将你的代码变更保存到本地代码仓库中&#xff0c;它创建了一个新的提交&#xff08;commit…

idea的插件,反编译整个jar包

idea的插件&#xff0c;反编译整个jar包 1.安装插件1.1找到插件1.2 搜索插件 2.反编译整个jar包2.1 复制jar包到工件目录下&#xff1a;2.2 选中jar包&#xff0c;点出右键 3.不用插件&#xff0c;手动查看某一个java类3.1 选中jar包&#xff0c;点出右键 1.安装插件 1.1找到插…

Linux网络编程---Socket编程

一、网络套接字 一个文件描述符指向一个套接字(该套接字内部由内核借助两个缓冲区实现。) 在通信过程中&#xff0c;套接字一定是成对出现的 套接字通讯原理示意图&#xff1a; 二、预备知识 1. 网络字节序 内存中的多字节数据相对于内存地址有大端和小端之分 小端法&…

同事上班这样摸鱼,我坐边上咋看他都在专心写代码啊

我边上有个同事&#xff0c;我坐他边上&#xff0c;但是每天看着他都眉头紧锁&#xff0c;忙的不亦乐乎&#xff0c;但终于有一天&#xff0c;我发现了他上班摸鱼的秘诀。 我劝你千万不要学会这4招&#xff0c;要不就该不好好上班了。 目录 1 上班看电影&#xff1f; 2 上班…

自建SQL server 服务无法启动,提示评估期已过

问题背景 在服务器内安装的SQL server无法启动&#xff0c;报错提示如下截图&#xff0c;提示错误代码17051&#xff1a; 结合系统日志查看应用程序日志详情提示评估期已过&#xff0c;报错如下 问题原因 出现此报错原因是SQL server 安装时&#xff0c;使用的评估版本&#xf…

网络安全的防护措施有哪些?

1. 安全策略和合规性 2. 物理和网络安全 3. 数据加密 4. 软件和系统更新 5. 访问控制 6. 威胁监测和响应 7. 员工培训和安全意识 8. 备份和灾难恢复 零基础入门学习路线 视频配套资料&国内外网安书籍、文档 网络安全面试题 网络安全的防护措施多种多样&#xff0c…

基于Spring Boot的商务安全邮件收发系统设计与实现

基于Spring Boot的商务安全邮件收发系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 已发送效果图&#xff0c;用户可以对已发送信息…

【GitHub】2FA认证(双重身份验证)

GitHub 2FA认证&#xff08;双重身份验证&#xff09; 写在最前面一、使用 TOTP 应用程序配置双2FA&#xff08;双因素身份验证&#xff09;1. 介绍2. github3. 认证 官网介绍小结 & 补充 &#xff1a;权限不足or验证码错误问题 &#x1f308;你好呀&#xff01;我是 是Yu欸…

张大哥笔记:普通人可以靠知识付费赚到钱吗?

大家好&#xff0c;我是张大哥&#xff0c;今天给大家聊聊普通人怎么做知识付费赚钱这个话题&#xff0c;首先科普一下&#xff0c;什么是知识付费&#xff1f;把知识变成产品或服务&#xff0c;以实现商业价值的行为就是知识付费&#xff01; 做知识付费类的项目&#xff0c;首…

MySQL数据库基础(数据库的基本操作、常用的数据类型、表的相关操作)

前言 今天我们将介绍数据库的基本操作、常用的数据类型、表的相关操作 一、数据库的基本操作 1.1 显示当前的数据库 操作代码 show databases;1.2 创建数据库 基本语法&#xff1a; 1. //创建数据库 create database examble;2. create database if not exists exist exa…

CentOS命令大全:掌握关键命令及其精妙用法!

CentOS是一种流行的开源企业级Linux发行版&#xff0c;它基于Red Hat Enterprise Linux (RHEL)的源代码构建。对于系统管理员和运维工程师来说&#xff0c;掌握CentOS的常用命令至关重要。 这些命令不仅可以帮助管理服务器&#xff0c;还可以进行故障排查、性能监控和安全加固等…

代码随想录(番外)图论3|1020. 飞地的数量|130. 被围绕的区域

代码随想录&#xff08;番外&#xff09;图论3|1020. 飞地的数量|130. 被围绕的区域 1020. 飞地的数量 class Solution { public:int dir[4][2]{0,1,1,0,0,-1,-1,0};int count;void dfs(vector<vector<int>>& grid,int x,int y){grid[x][y]0;count;for(int i…

人形机器人核心架构梳理

定义&#xff1a;机器人是能进行运动、操纵或定位且具有一定程度自主能力的可编程执行机构。按外在形态分类可分为传统机器人和人形机器人&#xff0c;其中人形机器人是一种利用人工智能和机器人技术制造的具有类似人类外观和行为的机器人。 人形机器人发展历程&#xff1a; 人…

C++之运算符重载

一&#xff1a;运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其 返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型与参数列表与普通的函数类似。 函数名字为&#xff1a;关键字oper…

Linux基础——冯诺依曼体系结构与操作系统

前言&#xff1a;在进入Linux进阶知识之前&#xff0c;我们还需理解最后一点知识&#xff0c;先认识理解冯诺依曼体系结构&#xff0c;再认识理解操作系统定位这样才能更好的理解后面的知识 本篇主要内容&#xff1a; 冯诺依曼体系结构操作系统概念与定位 冯诺依曼系统 1. 冯诺…

Flink学习(九)-jar 包提交给 flink 集群执行

一、界面执行 1&#xff0c;点击左侧的 submit new job&#xff0c;然后点击add New 2&#xff0c;粘贴程序入口&#xff0c;设置并行度 3&#xff0c;执行后&#xff0c;就可以在 taskManager 中找到相关任务了 二、控制台执行 在命令行中&#xff0c;在flink 的安装目录下&…

gitee关联picgo设置自己的typora_图床

一&#xff1a;去gitee官网创建仓库&#xff1a;typora_图床 1.百度搜索关键字&#xff1a;gitee&#xff0c;进入官网 2.进入gitee登录或者注册自己的账号 3.进入主页后&#xff0c;点击右上方 4.点击新建仓库 5.设置仓库名&#xff1a;typora_图床 6.点击5的创建&#xff0…

云渲染一张图多少钱

使用云渲染渲染一张效果图的价格没法确定多少钱一张&#xff0c;云渲染一张图的价格会受到多个因素的影响&#xff0c;如云渲染平台的定价策略、所选的渲染配置、优惠政策以及你提交的场景任务等。因此&#xff0c;无法给出确切的单一价格。 不同的云渲染平台会有不同的定价模…