java解非线性方程组_求解非线性方程

这篇博客介绍了如何利用Python的scipy.optimize.newton_krylov方法求解二维非线性方程组,具体是一个涉及积分的2D问题。作者在N * N网格上对f(kx, ky)进行操作,并通过迭代寻找解决方案。尽管遇到计算速度慢和初始猜测不准确的问题,作者仍试图理解newton_krylov方法在此场景中的适用性,并探讨了如何处理f(0, 0)为零的约束条件。" 123433106,9387022,深度优先搜索在算法比赛中的应用,"['深度优先', '算法']
摘要由CSDN通过智能技术生成

我求解满足以下积分方程的f(kx,ky),k是2d中的向量

方程:

d9c3c3ff-e6ba-4dde-be3e-1be644d501fb.png

我将f(kx,ky)映射到2d N * N网格并求解了总N ^ 2个方程组 .

from scipy.optimize import newton_krylov

import numpy as n

L=10.0 # cut off of integral

N=100 # number of devision from 0 to L

delta=L/(N-1)

def f0(f): # define a larger matrix used in summation

f1=n.ones((2*N,2*N))

for i in range(0, N):

for j in range(0, N):

f1[i][j]=f[i][j]

return f1

def equation(f):

f2=n.empty((N,N))

for i in range(0, N): # i,j index of k

for j in range(0, N):

sum=0

for a in range(-N+1, N): # a,b index of p

for b in range(-N+1, N):

if a!=0 or b!=0:

for c in range(-N+1, N): # c,d index of q

for d in range(-N+1, N):

if c!=0 or d!=0:

if a!=c or b!=d:

if c!=-i or d!=-j:

sum=sum-delta**2/(delta**2*(a**2+b**2)\

+f0(f)[abs(a)][abs(b)])/(delta**2*((a-c)**2+(b-d)**2)\

+f0(f)[abs(a-c)][abs(b-d)])*(1/(delta**2*((c+i)**2+(d+j)**2)\

+f0(f)[abs(c+j)][abs(d+j)])-1/(delta**2*(c**2+d**2)\

+f0(f)[abs(c)][abs(d)]))

f2[i][j]=sum-f[i][j]

return f2

guess =n.ones((N, N), float)

sol = newton_krylov(equation, guess, method='lgmres', verbose=1)

print(sol)

我首先尝试使用非常小的参数l = 1,N = 4 . 解决方案的发现非常缓慢 .

0: |F(x)| = 23.6576; step 1; tol 0.487986

.....

519: |F(x)| = 21.4812; step 3.15471e-09; tol 0.9

.....

957: |F(x)| = 20.4225; step 2.03396e-06; tol 0.899997

.....

并且还在运行 .

最初的猜测远非实际的解决方案,也许这就是原因 . 我还想知道在我的情况下使用newton_krylov是否是一个好方法?

在实际解决方案中,注意f(0)也应该等于零 . 将奇点作为积分排除,求和是否合理?

还有一个问题,如何在解决方案中强制f(0,0)始终等于零?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值