我求解满足以下积分方程的f(kx,ky),k是2d中的向量
方程:
我将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)始终等于零?