鱼C论坛

 找回密码
 立即注册
查看: 1877|回复: 3

各位好!求助一个PYTHON做偏微分数值计算精度的问题

[复制链接]
发表于 2019-11-12 17:19:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在网上找了个算例,解二维抛物线偏微分方程,按算法跑了1600步,结果精确值为0的地方变成0.002几。但我看算例上用MATLAB做,计算值才10^-16。为什么差别这么大呢,是我的代码有问题还是,需要用什么方法提高PYTHON的精度呢?

希望有大神可以解惑!

附上自己的代码和算例链接
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Nov  8 18:04:41 2019

  4. @author: Administrator
  5. """
  6. from __future__ import division
  7. import numpy as np
  8. import math
  9. import matplotlib.pyplot as plt



  10. #计算初始U(j,k)

  11. h = 1/40  #空间步长
  12. t = 1/1600 #空间步长
  13.     #a2 = 1/16 #系数
  14. miu = t/h**2
  15. F1 = np.zeros((38,38))
  16. F2 = np.zeros((40,40))
  17. def doit():

  18.     a1,b1,c1 = construct_step1_A()
  19.     a2,b2,c2 = construct_step2_A()
  20.     U0 = initialize()
  21.     T = 0
  22.     er = []
  23.     while T<30:
  24.         Uhalf = forward_half_1(a1,b1,c1,U0)
  25.         U1 = forward_half_2(a2,b2,c2,Uhalf)
  26.         U0 = U1
  27.         T += 1

  28.     return U0

  29. #计算精确值
  30. def realsolve(j,k,t):
  31.     return math.sin(math.pi*j*h)*math.cos(math.pi*k*h)*math.e**(-math.pi**2/8*t)

  32. def initialize():
  33.     U = np.zeros((40,40))
  34.     for i in range(40):
  35.         for j in range(40):
  36.             U[i,j] = realsolve(i,j,0)
  37.         
  38.     return U


  39. #追赶法求解
  40. def thomas_solve(a,b,c,f):
  41.     x = np.zeros_like(f)
  42.     y = np.zeros_like(f)   
  43.     u = np.zeros_like(f)   
  44.     l = np.zeros((len(f)-1,1))   
  45.     u[0] = b[0]
  46.     for i in range(1,len(f)):
  47.         l[i-1] = a[i-1]/u[i-1]
  48.         u[i] = b[i] - l[i-1]*c[i-1]
  49.    
  50.     y[0] = f[0]
  51.     for i in range(1,len(f)):
  52.         y[i] = f[i] - l[i-1] * y[i-1]
  53.    
  54.     x[len(x)-1] = y[len(x)-1]/u[len(x)-1]
  55.     for i in range(len(x)-2,-1,-1):
  56.         x[i] = (y[i] - c[i]*x[i+1])/u[i]
  57.    
  58.     return x
  59.       
  60.    
  61. #初始化第一步A矩阵
  62. def construct_step1_A():   
  63.     a = np.ones((37,1))*(-1/32*miu)
  64.     c = np.ones((37,1))*(-1/32*miu)
  65.     b = np.ones((38,1))*(1+1/16*miu)
  66.    
  67.     return a,b,c
  68.    
  69. def construct_step2_A():
  70.     a = np.ones((39,1))*(-1/32*miu)
  71.     c = np.ones((39,1))*(-1/32*miu)
  72.     b = np.ones((40,1))*(1+1/16*miu)
  73.    
  74.     b[0] = 1
  75.     b[39] = 1
  76.     c[0] = -1
  77.     a[38] = -1
  78.    
  79.     return a,b,c
  80.    

  81. #初始化0时刻向量矩阵F
  82. def construct_step1_F(U0):   
  83.     for j in range(38):
  84.         for k in range(38):
  85.             F1[j,k] = miu/32*(U0[j+1,k+1-1] - 2*U0[j+1,k+1] + U0[j+1,k+1+1]) + U0[j+1,k+1]
  86.    
  87.     return F1

  88. def construct_step2_F(U1):   
  89.     for j in range(1,39):
  90.         for k in range(1,39):
  91.             F2[j,k] = miu/32*(U1[j-1,k] - 2*U1[j,k] + U1[j+1,k]) +U1[j,k]
  92.    
  93.     return F2


  94. def forward_half_1(a1,b1,c1,U0):
  95.     F1 = construct_step1_F(U0)
  96.     Uhalf = np.zeros_like(U0)
  97.     for k in range(1,Uhalf.shape[0]-1):
  98.         Uhalf[1:Uhalf.shape[0]-1,k] = thomas_solve(a1,b1,c1,F1[:,k-1])

  99.     return Uhalf


  100. def forward_half_2(a2,b2,c2,Uhalf):
  101.     F2 = construct_step2_F(Uhalf)
  102.     U1 = np.zeros_like(Uhalf)
  103.     for j in range(U1.shape[0]):
  104.         U1[j,:] = thomas_solve(a2,b2,c2,F2[j,:])
  105.       
  106.     return U1



  107.             
  108.    

复制代码
算例地址
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-12 17:51:37 From FishC Mobile | 显示全部楼层
这方面MATLAB才是专业吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-12 19:37:49 | 显示全部楼层
wp231957 发表于 2019-11-12 17:51
这方面MATLAB才是专业吧

想用PYTHON做做。。如果不行就去用MATLAB做。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-12 21:18:37 | 显示全部楼层
求帮助!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-20 17:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表