双共轭梯度预处理(BICGSTAB)(python,数值积分)

第十五课 双共轭梯度处理

采取预处理的原因在上一篇中已经介绍预处理共轭梯度
此篇预处理在第十三课稳定双共轭梯度的基础上
算例采用之前的在这里插入图片描述
详细计算过程可见高斯消元解方程

左手边预处理

#线性联立方程的双共轭梯度法(左手边预处理)
import numpy as np
import math
import B
n=3
converged=np.array([False])
precon=np.zeros((n,1))
v=np.zeros((n,1))
r=np.zeros((n,1))
r0_hat=np.zeros((n,1))
p=np.zeros((n,1))
s=np.zeros((n,1))
t=np.zeros((n,1))
#xnew=np.zeros((n,1))
a=np.array([[10,1,-5],[-20,3,20],[5,3,5]],dtype=np.float)
b=np.array([[1],[2],[6]],dtype=np.float)
x=np.array([[1],[1],[1]],dtype=np.float)
tol=1.0e-5
limit=100
print('系数矩阵')
print(a[:])
print('右手边向量',b[:,0])
print('初始猜测值',x[:,0])
#简单主对角线预处理
for i in range(1,n+1):
    precon[i-1,0]=1.0/a[i-1,i-1]
for i in range(1,n+1):
    a[i-1,:]=a[i-1,:]*precon[i-1,0]
#对左手边应用预处理
b[:]=b[:]*precon[:]
r[:]=b[:]-np.dot(a,x)
r0_hat[:]=r[:]
rho0=1.0
alpha=1.0
w=1.0
v[:]=1.0
p[:]=1.0
rho1=np.dot(np.transpose(r0_hat),r)
print('前几次迭代值')
iters=0
while(True):
    iters=iters+1
    converged[:]=(np.linalg.norm(r)<tol*np.linalg.norm(b))
    if converged==True or iters==limit:
        break
    beta=(rho1/rho0)*(alpha/w)
    p[:,0]=r[:,0]+beta*(p[:,0]-w*v[:,0])
    v[:]=np.dot(a,p)
    alpha=rho1/np.dot(np.transpose(r0_hat),v)
    s[:,0]=r[:,0]-alpha*v[:,0]
    t[:]=np.dot(a,s)
    w=np.dot(np.transpose(t),s)/np.dot(np.transpose(t),t)
    rho0=rho1
    rho1=-w*np.dot(np.transpose(r0_hat),t)
    x[:,0]=x[:,0]+alpha*p[:,0]+w*s[:,0]
    r[:,0]=s[:,0]-w*t[:,0]
    if iters<5:
        print(x[:,0])
print('到收敛需要迭代次数',iters)
print('解向量',x[:,0])   

终端输出结果在这里插入图片描述
程序结果与计算结果一致

右手边预处理

#线性联立方程的双共轭梯度法(左手边预处理)
import numpy as np
import math
import B
n=3
converged=np.array([False])
precon=np.zeros((n,1))
v=np.zeros((n,1))
r=np.zeros((n,1))
r0_hat=np.zeros((n,1))
p=np.zeros((n,1))
p1=np.zeros((n,1))
s=np.zeros((n,1))
s1=np.zeros((n,1))
t=np.zeros((n,1))
#xnew=np.zeros((n,1))
a=np.array([[10,1,-5],[-20,3,20],[5,3,5]],dtype=np.float)
b=np.array([[1],[2],[6]],dtype=np.float)
x=np.array([[1],[1],[1]],dtype=np.float)
tol=1.0e-5
limit=100
print('系数矩阵')
print(a[:])
print('右手边向量',b[:,0])
print('初始猜测值',x[:,0])
#简单主对角线预处理
for i in range(1,n+1):
    precon[i-1,0]=1.0/a[i-1,i-1]
for i in range(1,n+1):
    a[i-1,:]=a[i-1,:]*precon[i-1,0]
#对右手边应用预处理
b[:]=b[:]*precon[:]
r[:]=b[:]-np.dot(a,x)
r0_hat[:]=r[:]
x[:]=x[:]/precon[:]
rho0=1.0
alpha=1.0
w=1.0
v[:]=1.0
p[:]=1.0
rho1=np.dot(np.transpose(r0_hat),r)
print('前几次迭代值')
iters=0
while(True):
    iters=iters+1
    converged[:]=(np.linalg.norm(r)<tol*np.linalg.norm(b))
    if converged==True or iters==limit:
        break
    beta=(rho1/rho0)*(alpha/w)
    p[:,0]=r[:,0]+beta*(p[:,0]-w*v[:,0])
    p1[:,0]=p[:,0]*precon[:,0]
    v[:]=np.dot(a,p1)
    alpha=rho1/np.dot(np.transpose(r0_hat),v)
    s[:,0]=r[:,0]-alpha*v[:,0]
    s1[:,0]=s[:,0]*precon[:,0]
    t[:]=np.dot(a,s1)
    w=np.dot(np.transpose(t),s)/np.dot(np.transpose(t),t)
    rho0=rho1
    rho1=-w*np.dot(np.transpose(r0_hat),t)
    x[:,0]=x[:,0]+alpha*p[:,0]+w*s[:,0]
    r[:,0]=s[:,0]-w*t[:,0]
    if iters<5:
        print(x[:,0]*precon[:,0])
x[:,0]=x[:,0]*precon[:,0]
print('到收敛需要迭代次数',iters)
print('解向量',x[:,0])   

终端输出结果
在这里插入图片描述
程序结果与计算结果一致

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

深渊潜航

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

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

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

打赏作者

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

抵扣说明:

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

余额充值