2

複素数とその共役を持つ多項式を SymPy でシンボリックに解こうとしています。私は長い道のりを歩んできたと思いますsolveが、多項式は解決可能ですが、解決策はありません。

from sympy import *

# set up symbols
a, b = symbols("a b", real=True)
t = a+I*b
T = functions.conjugate(t)

# set up polynomial
a1=0.005+I*0.0009
a2=0.9+I*-0.9
a3=0.4+I*0.5
a4=8+I*-80
a5=284+I*-1.5
a6=27100+I*-11500
poly=t**2 * T * a1 + t * T * a2 + t**2 * a3 + T * a4 + t * a5 + a6

# Trying to solve symbolically...
solve([re(poly), im(poly)], a, b)
#     Output: []

# Solving numerically works, but only finds one solution...
nsolve((re(poly), im(poly)), (a, b), (0, 0))
#     Output: matrix(
#             [['-137.962596090596'],
#              ['52.6296963395752']])

# verify with two solutions obtained in Maxima
poly.subs({a:-137.9625935162095, b:52.6296992481203}).n()
#     Output: 0.000540354631040322 + 0.00054727003909351*I
poly.subs({a:-332.6474382554614+I*-185.9848818313149, b:258.0065640091016+I*-272.3344263478699}).n()
#     Output: -6.55448222470652e-12 - 1.41238056784605e-12*I

何か案は?

4

1 に答える 1

3

問題の 1 つは、係数に浮動小数点数が含まれていることです。これは、多くの場合、シンボリック ソフトウェアでは機能しません。

f=10000*simplify(re(poly)) と g=10000*simplify(im(poly)) を使用して結果を編集すると、整数係数の多項式が得られます。CAS (私の場合はマグマ) は、多項式として与えられる f と g の理想の三角形表現を生成できます。

a - 2483798807340123709959247/13545514719183259347425004828125*b^4
  + 66732206412048596386372283/541820588767330373897000193125*b^3 
  - 3849759933277117021785191063/86691294202772859823520030900*b^2
  + 9245906471290310401430681453/1733825884055457196470400618*b
  - 31414499425567273751868164900/866912942027728598235200309,

b^5 - 189465979625/206648369*b^4 
    + 330827538698125/826593476*b^3
    - 17645868534640625/206648369*b^2 
    + 1724106750659765625/206648369*b
    - 52548859891484375000/206648369

これは、5 つの解が存在することを示しています。2 番目の多項式の数値解は次のとおりです。

174.10461010682254746847015187264557067610513554291323564643772 
 + 63.402741884833821878468926640811609033267039765104756747285816*i

174.104610106822547468470151872645570676105135542913235646437738
 - 63.402741884833821878468926640811609033267039765104756747285804*i

258.006564009101655109715962546854008929462784282347754971379392
  + 272.334426347869856080204881056671278679761260094680345276069337*i

258.006564009101655109715962546854008929462784282347754971379382
 - 272.334426347869856080204881056671278679761260094680345276069359*i

52.62969633957523864698147679803879873180829265956656342643376

その結果、正確に 1 つの実解が得られます。sympy の数値結果は正しく、完全でした。

于 2013-12-12T14:02:40.620 に答える