求解非线性方程

时间:2017-09-21 04:47:01

标签: python equation-solving

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

方程:

here is the equation

我将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)始终等于零?

0 个答案:

没有答案