首页 > 其他分享 >2024 XTU PDE 12题 两点边值问题有限体积格式

2024 XTU PDE 12题 两点边值问题有限体积格式

时间:2024-06-10 12:29:32浏览次数:9  
标签:XTU 12 return NN self 2024 zeros np NS

考虑如下两点边值问题
\[\begin{cases}-u^{''}+10(2x-1)u'+20u=0,\quad0<x<1,\\
u(0)=u(1)=1.\end{cases}\]
真解取为
\[u=e^{-10x(1-x)}.\]
写出求解上述问题的有限体积格式。
编程实现上述有限体积法,并计算节点处的最大误差,考查其收敛阶。

解:(a) 有限体积格式:
\[\left\{
\begin{aligned}
&-\left[\frac{u_{i+1}-u_i}{h_{i+1}}-
\frac{u_i-u_{i-1}}{h_i}\right]+\frac12c_i\left(u_{i+1}-u_{i-1}\right)+\frac{h_i+h_{i+1}}2d_iu_i=0,\quad i=1,2,\cdots,N-1.\\
&u_0=u_N=1.
\end{aligned}\right.
\]
其中
\[ c_i=\frac2{h_i+h_{i+1}}\int_{x_{i-1/2}}^{x_{i+1/2}}10(2x-1)dx,\quad d_i=\frac2{h_i+h_{i+1}}\int_{x_{i-1/2}}^{x_{i+1/2}}20dx.\]

import numpy as np
from scipy.sparse import coo_matrix, csc_matrix, \
    csr_matrix, spdiags
from scipy.sparse.linalg import spsolve
import matplotlib.pyplot as plt


class PoissonData1d:
    def __init__(self, L=0, R=1):
        self.L = L
        self.R = R

    def domain(self):
        return (self.L, self.R)

    def init_mesh(self, NS):
        x = np.linspace(self.L, self.R, num=NS + 1)
        return x

    def solution(self, x):
        """
        :param x:
        :return: 真解
        """
        return np.exp(-10 * x * (1 - x))

    def source(self, x):
        """
        :param x:
        :return: 右端向量
        """
        return np.zeros(len(x))


def fvm(data, NS):
    x = data.init_mesh(NS=NS)
    NN = len(x)
    h = x[1] - x[0]
    c1 = np.zeros(NN - 2)
    for i in range(NN - 2):
        c1[i] = -1 / h + 10 * x[i+1] - 5
    val = np.zeros((3, NN - 2))
    c2 = 2 / h + 20 * h
    c3 = np.zeros(NN - 2)
    for i in range(NN - 2):
        c3[i] = -1 / h - 10 * x[i+1] + 5
    val[1, :] = c2
    val[0, :] = c1

    val[2, :] = c3

    diags = np.array([-1, 0, 1])
    A = spdiags(val, diags, NN - 2, NN - 2).tocsr()
    A = A.T
    # print(A)
    F = np.zeros(len(x[1: NN - 1]))
    F[0] = -c3[0]
    F[-1] = -c1[-1]
    print(F)
    u = np.zeros((NN,), dtype=np.float_)
    u[[0, -1]] = data.solution(x[[0, -1]])
    # print(A)
    u[1: -1] = spsolve(A, F)
    return x, u


def error(x, u, uh):
    e = u - uh
    emax = np.max(np.abs(e))
    return emax


L = 0
R = 1
NS = 4
maxit = 5
data = PoissonData1d(L=L, R=R)
e = np.zeros((maxit, 1), dtype=np.float_)
fig = plt.figure()
axes = fig.gca()
for i in range(maxit):
    x, uh = fvm(data, NS)
    u = data.solution(x)
    e[i, 0] = error(x, u, uh)
    axes.plot(x, uh, linestyle='-', marker='o', markersize=4, label='N=%d' % NS)
    axes.set_title(" The solution plot ")
    axes.set_xlabel("x")
    axes.set_ylabel("u")
    if i < maxit - 1:
        NS *= 2

axes.plot(x, u, label='exact')
plt.legend(loc='upper right')
print(" error :\n", e)
plt.show()

标签:XTU,12,return,NN,self,2024,zeros,np,NS
From: https://blog.csdn.net/weixin_65478892/article/details/139575380

相关文章

  • 浅谈2024年全国中学生生物学联赛
    坐标gd谈谈联赛流水账day-n吃了蛋糕感谢家乐哥、圆领姐、刘sir和黄豆前来捧场,不过忘记叫盛哥来了教练把已经退役的人拉回来考试?然后在教学楼大发雷霆这几天身体一直不太好,先是发烧,退烧了之后就开始感冒+腹泻,十分难受。保济丸狂闷随便看了点比解day0感冒好得差不多,疯狂......
  • Leetcode-1221
    题目1221.分割平衡字符串难度:简单在一个平衡字符串中,'L'和'R'字符的数量是相同的。给你一个平衡字符串s,请你将它分割成尽可能多的平衡字符串。注意:分割得到的每个字符串都必须是平衡字符串,且分割得到的平衡字符串是原平衡字符串的连续子串。返回可以通过分割得到的平衡......
  • 202400610刷题总结
    T1T559。T2(带权并查集)1380。把行和列的取值看成变量,其中行取1代表+1,列取1代表-1,为了凑x-y=c,这样可以拿并查集来做了。维护d[x],到根的距离,我们把边定义为+,反向走为-。这样就行了,如果在一个集合,那么判断距离是不是c。还可以差分约束,dfs(直接遍历一遍,遇到环就判断).#i......
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 机场航班调度程序(100分) - 三语言A
    ......
  • CorelDRAW2024注册码激活码分享,设计师的首选神器!
    【CorelDRAWGraphicsSuite2024】是一款集图形设计、照片编辑和矢量动画于一体的全面图形套件。这款软件因其用户友好的界面、强大的功能集以及支持多种文件格式而广受专业人士和业余爱好者的欢迎。它提供了创新的设计工具,如高级向量插图、页面布局、照片编辑等,旨在提升设计效......
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 最富裕的小家庭(100分) - 三语言AC
    ......
  • CDR2024中文版下载cdr2024终身永久版CorelDRAW2024中文破解版Crack下载安装方法
    CorelDRAW2024是一款功能强大的矢量图形设计软件,适用于专业级图形设计作品的设计师和创作者。它提供了智能对象、布局、插图和模板等功能,可以帮助用户快速创建高质量的设计作品。这款软件的用户界面直观且易于使用,允许用户快速访问和管理设计工具和功能。它还提供了多种自定义......
  • GK2024 游记
    License:CCBY-NC-SA4.0前情提要:拿到了高考体验卡。同级还有\(O(1)\)个和我一起来考的。目录Day0(2024.6.6)Day1语文Day499122178数学Day2物理Day499122179英语Day3化学Day499122180生物Day332748121Day0(2024.6.6)来到考点,熟悉了一下路线。然后就是各科老......
  • C++Primer Plus 第12章 类和动态内存分配 12.10编程练习第1题new,delete的指向深度拷
    C++PrimerPlus第12章类和动态内存分配12.10编程练习第1题`提示:练习一定要动手操作涉及标准函数及关键词1,new[],delete[],strlen(),strcpy_s(),cout,endl,explicit例如:1,对于下面的类的声明:`提示:设计数组和字符串的new,delete文章目录C++PrimerPlus第12章类......
  • Kali Linux 2024.2 发布 (t64, GNOME 46 & Community Packages) - 领先的渗透测试发行
    KaliLinux2024.2发布(t64,GNOME46&CommunityPackages)-领先的渗透测试发行版ThemostadvancedPenetrationTestingDistribution请访问原文链接:https://sysin.org/blog/kali-linux/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgKaliLinux2024.2已......