0

非線形方程式を解くために fsolve を使用しています。私の問題は、出発点に応じて解決策が変わり、見つけたものが最も合理的であるかどうかわからないことです。これがコードです

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve, brentq,newton


A = np.arange(0.05,0.95,0.01)


PHI = np.deg2rad(np.arange(0,90,1))

def f(b):
    return np.angle((1+3*a**4-3*a**2)+(a**4-a**6)*(np.exp(2j*b)+2*np.exp(-1j*b))+(a**2-2*a**4+a**6)*(np.exp(-2j*b)+2*np.exp(1j*b)))-Phi  


B = np.zeros((len(A),len(PHI)))
for i in range(len(A)):
    for j in range(len(PHI)):
        a = A[i]
        Phi = PHI[j]
        b = fsolve(f, 1)
        B[i,j]= b

より妥当な値が得られると思われるため、x0 = 1 に修正しました。しかし、メソッドが収束せず、結果の値が大きすぎると思うことがあります。

最善の解決策を見つけるにはどうすればよいですか?

どうもありがとう!

4

1 に答える 1

1

非線形ソルバーを緩める際の永遠の問題は、関数、最初の推測、ソルバー自体、および対処しようとしている問題をよく理解することです。

関数が実際のルートを持たない (a,Phi) の組み合わせが多数あることに注意してください。解決しようとしている実際の問題に基づいて計算を行い、関数がどこにルートを持つべきかを判断する必要があります。実際の問題がわからないので、あなたに代わってそれを行うことはできません。

また、(削除されたため)回答に記載されているように、これはbで循環的であるため、制限付きソルバー(method = 'L-BFGS-B'を使用したscipy.optimize.minimizeなど)を使用すると、物事を制御下に置くのに役立つ場合があります。最小化器で根を見つけるには、関数の 2 乗を使用します. 見つかった最小値がゼロに近くない場合 (問題に基づいて定義するため)、実際の最小値は複素共役ペアである可能性があります.

幸運を。

于 2014-02-07T22:12:32.883 に答える