2014-10-06 68 views
0

我想解决一个三角方程的系统,我认为Python没有生成正确的解决方案。方程我试图解决:使用python求解三角非线性方程:我做错了什么?

  • 1 - 2cosθ +2cosθ - 2cosθ = -0.8

  • 1 - 2cos5θ +2cos5θ - 2cos5θ = 0

  • 1 - 2cos7θ +2cos7θ - 2cos7θ = 0

我的Python代码:

from scipy.optimize import fsolve 
import math 
import numpy as np 

def equations(p): 
    x,y,z = p 
    f1 = (1 - 2*math.cos(math.radians(x)) + 2*math.cos(math.radians(y)) - 2*math.cos(math.radians(z)) + 0.8) 
    f2 = (1 - 2*math.cos(math.radians(5*x)) + 2*math.cos(math.radians(5*y)) - 2*math.cos(math.radians(5*z))) 
    f3 = (1 - 2*math.cos(math.radians(7*x)) + 2*math.cos(math.radians(7*y)) - 2*math.cos(math.radians(7*z))) 
    return (f1,f2,f3) 

x,y,z = fsolve(equations,(0,0,0)) 

print equations((x,y,z)) 

该印刷:

(-1.9451107391432743e-13,4.241273998673023 e-12,-1.5478729409323932e-12)

,因为我检查使用这是错误的:

print (1 - 2*math.cos(math.radians(5*-1.9451107391432743e-13)) + 
      2*math.cos(math.radians(5*4.241273998673023e-12)) - 
      2*math.cos(math.radians(5*-1.5478729409323932e-12))) 

,这不打印但打印-1。任何人都可以告诉我我在这里做错了什么?

另一个问题是fsolve基于初始值生成解决方案。所以如果我将我的初始值从(0,0,0)更改为(1,1,1), I might get another new solution. Is there a way I can define a "range" of initial values for each variable x,y,z`并获得一系列解决方案?

回答

1

你的代码似乎很好。它最终打印错误,而不是解决方案。您实际上是通过在最后两行中找到fsolve找到的答案来调用您的方程来检查解决方案。如果您想查看变量的值,可以执行print x, y, z

+0

另一个问题是'fsolve'基于初始值生成解决方案。所以如果我把我的初始值从'(0,0,0)'改变为'(1,1,1),我可能会得到另一个新的解决方案。有没有一种方法可以为每个变量'x,y,z'定义初始值的“范围”并获得一系列解决方案?如果有办法做到这一点,你可以给我建议吗?再次感谢 – 2014-10-06 04:29:37

+1

不幸的是,即使指定了一系列的起始值,仍然没有找到非线性方程的所有解的直接方法。但是,您可以从许多不同的起点开始,并使用for循环记住每个解决方案,例如[解] = [fsolve(方程式,起点),用于[(0,0,0),(1 ,1,1)])' – chthonicdaemon 2014-10-06 06:40:44

+0

请注意,您应该尝试编写该程序,如果遇到问题,您应该提出一个新问题,而不是在评论中提出新问题。 – chthonicdaemon 2014-10-06 06:42:48