Python科学计算:网格

在很多问题中,讲数据于空间网格上的点相关联,简单的来说,假设网格是均匀的,,实际情况中,我妈会希望分辨率为每个维度100点,二维网格就是个网格点,三维网格就是个网格点,可以将他们打包成维度为的向量(一维数组),这些数据会受到代数或者是微分方程的制约,计实基础方程是非线性的,也要对其进行线性化操作,我们没有办法求解这么巨大的非线性方程组,所以,需要求解一个非常大的线性方程组:

实际上,我们在通常情况下啊是没有法子直接求解这个方程的,所以我们要使用迭代方法,都是通过迭代u,使得残差向量:趋向于0,但是这些方法单独使用的时候,都存在一个致命缺陷。

多重网格的关键思想:

  1. 假设考虑一个额外的线性维数为N/2的数组,就是两倍的间距,同样,假设仔细的将停滞解u、源f和算子A从原来的精细网格转换到新的粗糙网格上来,因为精细网格残差主要是由低频中枢组成的,这些中枢将在粗糙网格上得到精确的表示,但是从粗糙网格的角度来看,其中的一半将会是高频的,通过迭代,可以将他们减少到接近于0,然后再静数据传送回到精细网格终球,这样会将进一步移除残差的傅里叶众数的四分之一,也就是说,我妈总共移除了3/4;

  1. 不限于上述的两个模型,我们可以建立第三个,甚至是更加粗糙的网格,然后再重复这个过程,以消除7/8的残差傅里叶众数,但是要注意,附加的网格只能占据原始网格大小的一小部分,并且这种惩罚会通过提高速度而变得合理。

多重网格工具:

1、松弛法:

虽然矩阵A通常是稀疏矩阵,但是他有着非常大的维度,尤其是当底层空间网格有两个或者更多的维度的时候,我们用直接法(比如说高斯消元等)都没有什么优势可言,可以通过迭代法,就是“松弛”过程来寻求近似解,假设把一个二阶导数,改写为:

雅各比迭代的定义:

从满足的一些近似解开始,在上式的右边使用这个方法,就可以计算新的近似

把这个过程记作,在合理的条件下可以证明,k趋近于无穷大的时候,第k次迭代收敛到精确解u,实际上,使用的时候一般使用的是加权雅各比法:假设是属于的一个参数,同时我们假设:通常,我们会选择

import numpy as np
import matplotlib.pyplot as plt
N=16
omega=2.0/3.0
max_its=8
x=np.linspace(0,1,N+1)
s1=np.sin(np.pi*x)
s13=np.sin(np.pi*13*x)
e_old=s1+s13/3.0
e=np.zeros_like(e_old)
plt.plot(e_old)
for i in range(max_its) :
    e[1:-1]=(1.0-omega)*e_old[1:-1]+0.5*omega*(e_old[0:-2]+e_old[2:])
    plt.plot(e)
    e_old=e.copy()
plt.xlabel("The 17 grid points")
plt.ylabel("The first 8 iterates of the error")
plt.show()

图1:具有16个区间的网格上的雅各比迭代,误差的初始迭代是第一次谐波和第13次谐波的混合,为极度锯齿曲线,从图中可以看到8个甲醛雅各比迭代的结果,非常有想的抑制了粗糙众数,但是在减小误差中的平滑基本众数方面非常慢

其他精典的松弛方法,常见的由高斯-赛德尔方法,是及时利用第一个式子右侧计算出来的分量

具体的csdn上多的是,就不细讲了,至此,Python科学计算这本书就大体上讲完了,说实话,我的目的就是学着绘图,没想到一下子用了将进一个月的时间去学。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值