构建优化函数

利用差分法得到AX=b,求解F(x)=0.5∗xTAx−bTxF(x)=0.5*x^{T}Ax-b^{T}xF(x)=0.5∗xTAx−bTx
首先明确里面的A是对称正定矩阵,然后我们开始构造A,b。

import torch
import numpy as np
import timedef UU(X, order,prob):#X表示(x,t)if prob==1:temp = 10*(X[:,0]+X[:,1])**2 + (X[:,0]-X[:,1])**2 + 0.5if order[0]==0 and order[1]==0:return torch.log(temp)if order[0]==1 and order[1]==0:#对x求偏导return temp**(-1) * (20*(X[:,0]+X[:,1]) + 2*(X[:,0]-X[:,1]))if order[0]==0 and order[1]==1:#对t求偏导return temp**(-1) * (20*(X[:,0]+X[:,1]) - 2*(X[:,0]-X[:,1]))if order[0]==2 and order[1]==0:return - temp**(-2) * (20*(X[:,0]+X[:,1])+2*(X[:,0]-X[:,1])) ** 2 \+ temp**(-1) * (22)if order[0]==1 and order[1]==1:return - temp**(-2) * (20*(X[:,0]+X[:,1])+2*(X[:,0]-X[:,1])) \* (20*(X[:,0]+X[:,1])-2*(X[:,0]-X[:,1])) \+ temp**(-1) * (18)if order[0]==0 and order[1]==2:return - temp**(-2) * (20*(X[:,0]+X[:,1])-2*(X[:,0]-X[:,1])) ** 2 \+ temp**(-1) * (22)if prob==2:if order[0]==0 and order[1]==0:return (X[:,0]*X[:,0]*X[:,0]-X[:,0]) * \0.5*(np.exp(2*X[:,1])+np.exp(-2*X[:,1]))if order[0]==1 and order[1]==0:return (3*X[:,0]*X[:,0]-1) * \0.5*(np.exp(2*X[:,1])+np.exp(-2*X[:,1]))if order[0]==0 and order[1]==1:return (X[:,0]*X[:,0]*X[:,0]-X[:,0]) * \(np.exp(2*X[:,1])-np.exp(-2*X[:,1]))if order[0]==2 and order[1]==0:return (6*X[:,0]) * \0.5*(np.exp(2*X[:,1])+np.exp(-2*X[:,1]))if order[0]==1 and order[1]==1:return (3*X[:,0]*X[:,0]-1) * \(np.exp(2*X[:,1])-np.exp(-2*X[:,1]))if order[0]==0 and order[1]==2:return (X[:,0]*X[:,0]*X[:,0]-X[:,0]) * \2*(np.exp(2*X[:,1])+np.exp(-2*X[:,1]))if prob==3:temp1 = X[:,0]*X[:,0] - X[:,1]*X[:,1]temp2 = X[:,0]*X[:,0] + X[:,1]*X[:,1] + 0.1if order[0]==0 and order[1]==0:return temp1 * temp2**(-1)if order[0]==1 and order[1]==0:return (2*X[:,0]) * temp2**(-1) + \temp1 * (-1)*temp2**(-2) * (2*X[:,0])if order[0]==0 and order[1]==1:return (-2*X[:,1]) * temp2**(-1) + \temp1 * (-1)*temp2**(-2) * (2*X[:,1])if order[0]==2 and order[1]==0:return (2) * temp2**(-1) + \2 * (2*X[:,0]) * (-1)*temp2**(-2) * (2*X[:,0]) + \temp1 * (2)*temp2**(-3) * (2*X[:,0])**2 + \temp1 * (-1)*temp2**(-2) * (2)if order[0]==1 and order[1]==1:return (2*X[:,0]) * (-1)*temp2**(-2) * (2*X[:,1]) + \(-2*X[:,1]) * (-1)*temp2**(-2) * (2*X[:,0]) + \temp1 * (2)*temp2**(-3) * (2*X[:,0]) * (2*X[:,1])if order[0]==0 and order[1]==2:return (-2) * temp2**(-1) + \2 * (-2*X[:,1]) * (-1)*temp2**(-2) * (2*X[:,1]) + \temp1 * (2)*temp2**(-3) * (2*X[:,1])**2 + \temp1 * (-1)*temp2**(-2) * (2)
def F(prob,X):return -UU(X,[0,2],prob) - UU(X,[2,0],prob)
np.random.seed(1234)
torch.manual_seed(1234)
class FD():def __init__(self,bound,hx,prob):self.prob = probself.dim = 2self.hx = hxself.nx = [int((bound[0,1] - bound[0,0])/self.hx[0]) + 1,int((bound[1,1] - bound[1,0])/self.hx[1]) + 1]self.size = self.nx[0]*self.nx[1]self.X = np.zeros([self.size,self.dim])m = 0for i in range(self.nx[0]):for j in range(self.nx[1]):self.X[m,0] = bound[0,0] + i*self.hx[0]self.X[m,1] = bound[1,0] + j*self.hx[1]m = m + 1def matrix(self):self.A = np.zeros([self.nx[0]*self.nx[1],self.nx[0]*self.nx[1]])dx = self.hx[0];dy = self.hx[1]for i in range(self.nx[0]):for j in range(self.nx[1]):dx = self.hx[0];dy = self.hx[1]if i== 0 or i == self.nx[0] - 1 or j == 0 or j == self.nx[1] - 1:self.A[i*self.nx[1]+j,i*self.nx[1]+j] = 1else:self.A[i*self.nx[1]+j,i*self.nx[1]+j] = 2*(dx/dy + dy/dx)self.A[i*self.nx[1]+j,i*self.nx[1]+j-1] = -dx/dyself.A[i*self.nx[1]+j,i*self.nx[1]+j+1] = -dx/dyself.A[i*self.nx[1]+j,(i-1)*self.nx[1]+j] = -dy/dxself.A[i*self.nx[1]+j,(i+1)*self.nx[1]+j] = -dy/dxreturn self.Adef right(self,rig):self.b = np.zeros([self.nx[0]*self.nx[1],1])dx = self.hx[0];dy = self.hx[1]for i in range(self.nx[0]):for j in range(self.nx[1]):if i== 0 or i == self.nx[0] - 1 or j == 0 or j == self.nx[1] - 1:self.b[i*self.nx[1]+j] = UU(self.X[i*self.nx[1]+j:i*self.nx[1]+j+1,:],[0,0],self.prob)else:self.b[i*self.nx[1]+j] =  rig[:,(i - 1)*(self.nx[1] - 2) + j - 1]*dx*dyreturn self.bdef allsolve(self,rig):#第0个维度放数值,第1个维度放数量u = np.zeros([rig.shape[0],self.size])A = self.matrix()for i in range(rig.shape[0]):b = self.right(rig[i:i + 1])#print(b)tmp = np.linalg.solve(A,b)u[i:i + 1,:] = tmp.Treturn u
def error(u_pred,u_acc):temp = ((u_pred - u_acc)**2).sum()/(u_acc**2).sum()return temp**(0.5)

根据上面这个代码其实可以直接求解近似解,不过这里为了展示BFGS算法,所以我们还是取出A和b来求解优化问题。


def FF(X):#X = [1,n],b = [1,n]return 0.5*np.dot(np.dot(X,A),X.T) - np.dot(X,b.T)
def GG(X):tmp = np.dot(A,X.T) - b.Treturn tmp.T
def HH(X):return Adef gold(FF,GG,d,X):rho = 0.4am = 0;aM = 1;al = 0.5*(am + aM)for i in range(100):rig1 = FF(X) + rho*al*GG(X)@d.Trig2 = FF(X) + (1 - rho)*al*GG(X)@d.Tlef = FF(X + al*d)if lef <= rig1:if lef >= rig2:breakelse:am = alal = am + 0.618*(aM - am)else:aM = alal = am + 0.618*(aM - am)al_k = al#print(i)return al_k,2*(i + 1)
def BFGS(FF,GG,HH,X,m,N):tic = time.time()eps = 1e-20n = X.shape[1]fun_iter = 0X_new = np.zeros([1,n])S = np.zeros([m,n])Y = np.zeros([m,n])alpha = np.zeros(m)for i in range(N):if i <= m:if i == 0:al_k,ite = gold(FF,GG,-GG(X),X)fun_iter += iteX_new = X - GG(X)*al_kelse:s = X_new - Xy = GG(X_new) - GG(X)S[i - 1:i,:] = sY[i - 1:i,:] = y#d = np.linalg.solve(HH(X_new),-GG(X_new).T)d = -GG(X).Tal_k,ite = gold(FF,GG,d.T,X_new)#print(np.linalg.norm(X))X = X_new.copy()X_new = X_new - al_k*GG(X_new)fun_iter += ite#print(i,al_k,np.linalg.norm(X_new - X))#print(i,al_k,np.linalg.norm(GG(X_new),np.linalg.norm(GG(X_new)))#print(i,al_k,np.linalg.norm(GG(X_new)))else:s = X_new - Xy = GG(X_new) - GG(X)S[0:m - 1,:] = S[1:m,:]Y[0:m - 1,:] = Y[1:m,:]S[m - 1:m,:] = sY[m - 1:m,:] = ytmp = (s*y).sum()/(y*y).sum()q = GG(X_new)for j in range(m - 1,- 1,-1):alpha[j] = (S[j:j + 1,:]*q).sum()/(S[j:j + 1,:]*Y[j:j + 1,:]).sum()q = q - alpha[j]*Y[j:j + 1,:]r = tmp*qfor j in range(0,m,1):beta = (Y[j:j + 1,:]*r).sum()/(S[j:j + 1,:]*Y[j:j + 1,:]).sum()r = r + S[j:j + 1,:]*(alpha[j] - beta)al_k,ite = gold(FF,GG,-r,X_new)X = X_new.copy()X_new = X_new + (-r)left = np.linalg.norm(GG(X))rig = epsif left < rig:breakela = time.time() - ticprint('iteration:%d,grad_2:%.3e,fun_iter = %d,time = %.2f'%(i + 1,np.linalg.norm(GG(X)),fun_iter,ela))return X_new#--------------------------------
bound = np.array([[0,1.0],[0,1.0]])
hx = [0.02,0.05]
prob = 3
fd = FD(bound,hx,prob)
M = fd.nx[0];N = fd.nx[1]
X = fd.X
x = X.reshape([M,N,2])[1:M - 1,1:N -1]
rig = F(prob,x.reshape(-1,2)).reshape(1,-1)
#print(rig.shape)
u_pred = fd.allsolve(rig)u_acc = UU(X,[0,0],prob).reshape(1,-1)
#print(u_pred.shape,u_acc.shape)
print(error(u_pred,u_acc))
print(max(abs(u_pred[0,:] - u_acc[0,:])))
A = fd.matrix()
b = fd.right(rig).T
u_new = (np.linalg.solve(A,b.T)).T
print(max(abs(u_new[0,:] - u_acc[0,:])))
print(u_new.shape,b.shape)
print(np.linalg.norm(np.dot(A,u_new.T) - b.T),(np.dot(A,u_new.T) - b.T).shape)
print(np.linalg.norm(GG(u_new)))
print(np.linalg.norm(np.dot(u_new,A) - b),(np.dot(u_new,A) - b).shape)
#----------------------------------------
n = fd.size
m = 9
X_init = np.random.rand(1,n)
u_new = BFGS(FF,GG,HH,X_init,m,100)
print(u_new.shape)
print(FF(u_new))
print(max(abs(u_new[0,:] - u_acc[0,:])))

根据这个代码可以直接求解,然而发现求解大规模问题迭代耗时。这里就回到我们函数的定义上来理解。在定义FF,GG,HH函数的时候,里面出现了A矩阵,当规模很大的时候,矩阵A的规模也大,构造函数用时很长,我们需要想办法避免这种矩阵参与运算,尽量使用向量与向量之间的运算来定义函数。

有限内存BFGS求解泊松方程相关推荐

  1. 有限内存BFGS以及非精确牛顿法

    有限内存BFGS BFGS算法的每一步迭代皆形如: xk+1=xk−αkHkgkx_{k+1}=x_{k} - \alpha_{k}H_{k}g_{k}xk+1​=xk​−αk​Hk​gk​ Hk+1 ...

  2. 利用Python中的fealpy包求解泊松方程

    针对温度场模型利用fealpyfealpyfealpy包求解泊松方程 问题重述: 泊松方程: △u=∂2u∂x2+∂2u∂y2=f\bigtriangleup u = \frac{\partial^2 ...

  3. 第一个例子:求解泊松方程

    本人为个人学习之便在此转载,局部加工,版权归原作者:李若所有,更多文章请访问 作者的BLOG. (转载时请注明作者和出处.未经许可,请勿用于商业用途) [摘要] 狄氏边值问题的泊松方程 EasyMes ...

  4. 有限体积法求解二维方腔流(一)——动量方程和连续性方程的离散

    1. 有限体积法求解二维方腔流–理论手册 1.1. 不可压缩流体控制方程 连续性方程 ∇⋅U=0(1)\nabla \cdot U=0 \tag{1} ∇⋅U=0(1) 动量方程 ∂U∂t+∇⋅(UU ...

  5. tensorflow的安装和求解泊松方程

    tensorflow安装(windows系统中的anaconda) 1:点击anaconda prompt,进入以后键入命令 conda config --add channels https://m ...

  6. 求解欧拉方程的c语言,用有限体积方法求解欧拉方程

    <用有限体积方法求解欧拉方程>由会员分享,可在线阅读,更多相关<用有限体积方法求解欧拉方程(12页珍藏版)>请在人人文库网上搜索. 1.有限体积法求解二维可压缩Euler方程计 ...

  7. 求解欧拉方程的c语言,用有限体积方法求解欧拉方程.doc

    PAGE 4 - 实用标准 文档 有限体积法求解二维可压缩Euler方程 --计算流体力学课程大作业 老师: 夏健.刘学强 学生: 徐锡虎 学号: SQ09018013018 日期: 2010年2月5 ...

  8. 格林函数求解泊松方程介绍

    泊松方程是静电场问题的基础,下面我们以此方法为基础 自由空间中的泊松方程 可以证明这个方程的解为 用相同的方法,这个解记作格林函数 在自由空间下,任意泊松方程的 解可以写为 这就是静电场的叠加原理 如 ...

  9. 有限元与深度学习结合求解泊松方程-Petrov

    Petrov求解Dirichlet泊松方程 泊松方程引入 − Δ u = f , x ∈ Ω = ( 0 , 1 ) 2 -\Delta u=f,x \in \Omega=(0,1)^2 −Δu

最新文章

  1. BZOJ1058 [ZJOI2007]报表统计 set
  2. Python-TXT文本操作
  3. JAX-RS 从傻逼到牛叉 5:资源的动态定位
  4. [转]virtualbox下安装增强工具简单步骤
  5. java多线程编程--基础篇
  6. Boost:等待和通知操作的模糊测试
  7. 配置HTTPS以与Servlet一起使用
  8. WEB安全基础-URL跳转漏洞
  9. JLink v8固件丢失修复教程
  10. Linux C基础笔记(4)终结篇
  11. TrueNAS CORE是什么
  12. LeetCode 105. 从前序与中序遍历序列构造二叉树(递归)
  13. poj3083Children of the Candy Corn(dfs+bfs)
  14. Opencv图像处理(全)
  15. 禁用Google英文翻译功能
  16. Kettle基本使用(四) —— 应用的使用
  17. 忍者必须死代码 免费
  18. 考研高数 专题5:泰勒公式及其应用(皮亚诺型余项/局部)(拉格朗日余项/整体)
  19. Discus 论坛 在 pc 电脑上 访问手机版 ( mobile ) 和 触屏版(touch)设置
  20. Git Bash Here命令使用

热门文章

  1. Windows命令行启动MySql
  2. uniapp实现把电话号码存入手机通讯录中(适配安卓和ios)
  3. html引入babel-polyfill,babel-polyfill
  4. mysql econnreset_node使用knex连接mysql,每个小时大概率出现:read ECONNRESET?
  5. Python编程:从入门到实践(选记)
  6. 谁说菜鸟不会数据分析python pdf_谁说菜鸟不会数据分析spss
  7. 进项发票数据采集,进项发票明细数据采集导出
  8. python画图matplotlib直方图条怎么变宽_python – matplotlib和numpy – 直方图条颜色和规范化...
  9. 关于最近流行的APP界面
  10. linux系统运行hwclock报错,我使用过的Linux命令之hwclock - 查询和设置硬件时钟