东南大学数值分析第七章上机作业Python实现

本文分享了一个用Python编写的程序,通过矩阵求逆法求解边值问题。针对7.1.37的矩阵形式,处理严格对角占优的系数方阵。程序包括u(x,t)和f(x,t)函数定义,以及详细步骤解释了如何计算uik在不同时间和空间点的值。最后展示了部分特定位置的解结果。
摘要由CSDN通过智能技术生成

考试周快到了编程作业还没做完...花了一上午写了这个程序,验算了一下应该没有大问题,欢迎大家指出问题。本程序全原创,分享出来一起讨论!

正文开始,题目如下:

 程序设计思路如下,采用7.1.37的矩阵形式进行求解,两个系数方阵都是严格对角占优的,所以一定可逆,为了编程简单没有采用迭代格式,直接使用矩阵求逆法求解方程组。

下图为第二问程序;第三问略,具体思路如下:步长二分即M或N增倍。

import numpy as np
from sympy import *

# 此函数为调参入口
def u(x,t):
    if t==0:
        u = math.exp(x)
    elif x==0:
        u = math.exp(t)
    elif x==1:
        u = math.exp(1+t)
    return u

# 此函数为调参入口
def f(x,t):
    f = 0
    return f

a = 1
M = 640         # 此处为调参入口
N = 640         # 此处为调参入口
h = 1/M        # 此处默认x取0-1
tao = 1/N      # 此处默认t取0-1,也即T=1
x_i = np.array([i for i in np.arange(0, (M+5)*h, h)])  # (M+4)*1,包含0,索引为0~M+4,索引0和M为边界(x=0和x=1)
t_i = np.array([i for i in np.arange(0, (N+5)*tao, tao)])  # (M+4)*1,包含0,索引为0~M+4,索引0和M为边界(t=0和t=1)
r = a*tao/(h*h)
A_1 = np.zeros([M-1,M-1])    # (M-1)*(M-1)
A_2 = np.zeros([M-1,M-1])
for i in range(1,M-2):
    A_1[0,0]=1+r
    A_1[0,1]=-r/2
    A_1[M-2,M-2]=1+r
    A_1[M-2,M-3]=-r/2
    A_1[i,i]=1+r
    A_1[i,i+1]= -r/2
    A_1[i,i-1]= -r/2

    A_2[0, 0] = 1 - r
    A_2[0, 1] = r / 2
    A_2[M - 2, M - 2] = 1 - r
    A_2[M - 2, M - 3] = r / 2
    A_2[i,i]=1-r
    A_2[i, i - 1] = r/2
    A_2[i, i + 1] = r/2
uik = np.zeros([M+1,M-1])  # 共41行(t=0-1,间隔为0.025),39列,每行t不变;
uik[0,:] = [u(x,0) for x in np.arange(h,1,h)]  # uik为解,x属于h~39*h,第i行为t = i*tao解
for i in range(1,uik.shape[0]):      # i=1,2,...,39,40(对应t=1)
    U = np.zeros(M-1)      # (M-1)*1
    U[0] = tao*f(x_i[1],t_i[i]+tao/2) + r/2*(u(0,t_i[i])+u(0,t_i[i+1]))
    U[M-2] = tao*f(x_i[M-1],t_i[i]+tao/2) + r/2*(u(1,t_i[i])+u(1,t_i[i+1]))
    for j in range(1,M-2):
        U[j] = tao*f(x_i[j+1],t_i[i]+tao/2)
    uik[i,:] = np.dot(np.dot(np.linalg.inv(A_1),A_2),uik[i-1,:])+np.dot(np.linalg.inv(A_1),U)
# print(uik)
print("u(0.2, 1.0) = ", uik[int(1/tao),int(0.2/h-1)])
print("u(0.4, 1.0) = ", uik[int(1/tao),int(0.4/h-1)])
print("u(0.6, 1.0) = ", uik[int(1/tao),int(0.6/h-1)])
print("u(0.8, 1.0) = ", uik[int(1/tao),int(0.8/h-1)])

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嚯嚯火火火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值