Skip to main content
 首页 » 编程设计

python之如何用Python求解非线性三角方程组(MATLAB可以轻松求解)

2025年05月04日13qlqwjy

我正在尝试用 Python 求解非线性三角方程组。我尝试了以下方法:

from sympy import symbols,solve,sin,cos,pi, Eq 
 
measurements = [(5.71403,0.347064), (4.28889, -0.396854), (5.78091, -7.29133e-05),  
(2.06098, 0.380579), (8.13321, 0.272391), (8.23589, -0.304111), (6.53473, 0.265354), (1.6023,  
0.131908)] 
 
f, a, phi = symbols('f a phi') 
eq1 = Eq(a*sin((2.0*pi*f*measurements[0][0])+phi) - measurements[0][1]) 
eq2 = Eq(a*sin((2.0*pi*f*measurements[4][0])+phi) - measurements[4][1]) 
eq3 = Eq(a*sin((2.0*pi*f*measurements[6][0])+phi) - measurements[6][1]) 
solve((eq1,eq2,eq3), (a, f, phi)) 

Python 需要很长时间才能尝试求解方程。但是,MATLAB 可以瞬间完成。

有什么问题?

请您参考如下方法:

在 SymPy 中,如果你想要数值解,你应该使用 nsolve:

In [97]: nsolve((eq1,eq2,eq3), (a, f, phi), [1, 1, 1])                                                                             
Out[97]:  
⎡-0.5538674055548 ⎤ 
⎢                 ⎥ 
⎢0.837453526933376⎥ 
⎢                 ⎥ 
⎣6.95538865037068 ⎦ 

这里我使用了 [1, 1, 1] 的初始猜测。如果您使用其他初始猜测,我相信您可以找到更多的解决方案(系统有无限多的解决方案)。

请注意,如果您将这些近似解代入方程式,您将得到 False。这是因为作为近似数的 lhs 和 rhs 不相等:

In [101]: eq1                                                                                                                      
Out[101]: a⋅sin(11.42806⋅π⋅f + φ) - 0.347064 = 0 
 
In [102]: (sol,) = nsolve((eq1,eq2,eq3), (a, f, phi), [1, 1, 1], dict=True)                                                        
 
In [103]: sol                                                                                                                      
Out[103]: {a: -0.5538674055548, f: 0.837453526933376, φ: 6.95538865037068} 
 
In [104]: eq1.subs(sol)                                                                                                            
Out[104]: False 
 
In [105]: eq1.lhs.subs(sol)                                                                                                        
Out[105]: -0.347064 - 0.5538674055548⋅sin(6.95538865037068 + 9.57046915300624⋅π) 
 
In [106]: eq1.lhs.subs(sol).evalf()                                                                                                
Out[106]: -1.29025679909939e-15 

因为它不等于 rhs(为零)代入 Eq 将给出 False 但我们可以看到它是在四舍五入的顺序上错误。

使用 nsolve 的 prec 参数可以获得更多的精度:

In [107]: (sol,) = nsolve((eq1,eq2,eq3), (a, f, phi), [1, 1, 1], dict=True, prec=50)                                               
 
In [108]: sol                                                                                                                      
Out[108]:  
{a: -0.55386740555480009188439615822304411607289430639164, f: 0.83745352693337644862065403386504543698722276260565, φ: 6.9553886 
503706758809942541544797040214354242211993} 
 
In [109]: eq1.lhs.subs(sol).evalf()                                                                                                
Out[109]: -3.27785083138700e-51