在很多问题中,讲数据于空间网格上的点相关联,简单的来说,假设网格是均匀的,,实际情况中,我妈会希望分辨率为每个维度100点,二维网格就是个网格点,三维网格就是个网格点,可以将他们打包成维度为的向量(一维数组),这些数据会受到代数或者是微分方程的制约,计实基础方程是非线性的,也要对其进行线性化操作,我们没有办法求解这么巨大的非线性方程组,所以,需要求解一个非常大的线性方程组:
实际上,我们在通常情况下啊是没有法子直接求解这个方程的,所以我们要使用迭代方法,都是通过迭代u,使得残差向量:趋向于0,但是这些方法单独使用的时候,都存在一个致命缺陷。
多重网格的关键思想:
假设考虑一个额外的线性维数为N/2的数组,就是两倍的间距,同样,假设仔细的将停滞解u、源f和算子A从原来的精细网格转换到新的粗糙网格上来,因为精细网格残差主要是由低频中枢组成的,这些中枢将在粗糙网格上得到精确的表示,但是从粗糙网格的角度来看,其中的一半将会是高频的,通过迭代,可以将他们减少到接近于0,然后再静数据传送回到精细网格终球,这样会将进一步移除残差的傅里叶众数的四分之一,也就是说,我妈总共移除了3/4;
不限于上述的两个模型,我们可以建立第三个,甚至是更加粗糙的网格,然后再重复这个过程,以消除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()
其他精典的松弛方法,常见的由高斯-赛德尔方法,是及时利用第一个式子右侧计算出来的分量
具体的csdn上多的是,就不细讲了,至此,Python科学计算这本书就大体上讲完了,说实话,我的目的就是学着绘图,没想到一下子用了将进一个月的时间去学。