crank-nicolson格式解决处边值定解问题的python

麻烦各位帮我看看代码有啥问题,运行没有结果啊

import numpy as np
h = 1/20
tao = 1/20
i = 1
while 1:
    if abs(np.round(tao,i) - tao) < 10**(-5):
        num_tao = i
        break
    else:
        i += 1
low_space = 0
up_space = 1
low_time = 0
up_time = 1
a = 1
r = a * tao / h**2
x = np.array([
    low_space + h * i for i in range(100)
    if low_space + h * i < 1.0001 * up_space
])
t = np.array([
    low_time + tao * i for i in range(1000)
    if low_time + tao * i < 1.0001 * up_time
])
def exact_value(x,t):
    u = x * (np.e**t + x**2)
    return u
def u_0t(x,t):
    return 0
def u_1t(x,t):
    return 1+np.e**t
def u_x0(x,t):
    return x**3+x
def f_ik(x,t):
    return x * np.e**t - 6 * x
def abcf_computing(x,u_km1,t):
    var = x[1 : -1]
    a = [-r / 2] * len(var)
    b = [1 + r] * len(var)
    c = [-r / 2] * len(var)
    f = []
    for i in range(2,len(var)):
        temp = 0.5 * r * u_km1[i - 1]+(1 - r) * u_km1[i] + 0.5 * r * u_km1[i+1]
        f.append(tao * f_ik(x[i],t - 0.5 * tao)+temp)
        f.insert(0,(1 - r) * u_km1[1] + 0.5 * r * u_km1[2] + tao * f_ik(x[1], - 0.5 * tao + t) + 0.5 * r * (u_0t(0,t) + u_0t(0,t - tao)))
        f.append(u_km1[len(x) - 2] * (1 - r) + u_km1[len(x) - 3] * 0.5 * r + tao * f_ik(x[-2],t - 0.5 * tao) + 0.5 * r *(u_1t(1,t) + u_1t(1,t - tao)))
    return a,b,c,f
def chage_method(x,u_km1,t) :
    a,b,c,f = abcf_computing(x,u_km1,t)
    bbeta = [c[0] / b[0]]
    for i in range(1,len(f) - 1) :
        bbeta.append(c[i] / (b[i] - a[i - 1] * bbeta[i - 1]))
    yy = [f[0] / b[0]]
    for i in range(1,len(f)) :
        yy.append((f[i] - a[i - 1] * yy[i - 1]) / (b[i] - a[i - 1] * bbeta[i - 1]))
    xx = [0 for i in range(len(yy))]
    xx[-1] = yy[-1]
    for i in range(len(yy) - 2,-1,-1) :
        xx[i] = yy[i] - bbeta[i] * xx[i + 1]
    return xx
def crank_nicolson_method() :
    u_i0 = u_x0(x,0)
    result = {'0':u_i0}
    u_ikp1 = list(u_i0.copy())
    for k in range(0,len(t) - 1) :
        u_ik = u_ikp1.copy()
        u_ikp1 = chase_method(x,u_ik,t[k + 1])
        u_ikp1.insert(0,u_0t(0,t[k + 1]))
        u_ikp1.append(u_1t(1,t[k + 1]))
        result[str(np.round((k + 1) * tao,num_tao))] = u_ikp1
    return result
def error() :
    numerical_result = crank_nicolson_method()
    exact_values = {}
    for k in range(len(t)) :
        exact_t = exact_value(x,t[k])
        exact_values[str(np.round(k * tao,num_tao))] = exact_t
    return numerical_result,exact_values
def result_showing() :
    numerical_result,exact_value = error()
    exact_value_04 = []
    result_04 = []
    for i in range(2,11,2) :
        temp1 = numerical_result[str(np.round(i * 0.1,1))]
        temp2 = exact_value[str(np.round(i * 0.1,1))]
        result_04.append(temp1[int(np.round(0.4 / h,0))])
        exact_value_04.append(temp2[int(np.round(0.4 / h,0))])
    errors = abs(np.array(exact_value_04) - np.array(result_04))
    node = [str((0.4,np.round(i * 0.1,1))) for i in range(2,11,2)]
    tplt = "{0:^8}\t{1:^8}\t{2:^8}\t{3:^8}"
    tplt1 = "{0:^10.10}\t{1:^10.8f}\t{2:^10.8f}\t{3:^10.8f}"
    print(tplt.format("节点","数值解","精确解","误差"))
    for i in range(len(exact_value_04)) :
        print(tplt1.format(node[i],result_04[i],exact_value_04[i],errors[i]))
    result_showing()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值