为什么我不能使用某些特定参数来求解这些方程式? (同情)
Why I can't solve these equations using some specific parameters? (Sympy)
这是我尝试使用 sympy
:
求解的方程式代码
# Import sympy
from math import remainder, tau
from sympy import *
from sympy.solvers import solve
# Define the parameters
nx, ny, nz = [0,0,1]
a,b,c = [0,0,0]
d = 1
t = 9
# Solve the equations
theta = remainder(2*t*sqrt(b**2+c**2+d**2), tau)
delta, beta, gamma = symbols('delta beta gamma')
beta = 7 # Randomly assigned.
eq1 = Eq(tan((delta+beta)/2),nz*tan(theta/2))
eq2 = Eq(ny*tan((delta-beta)/2),nx)
eq3 = Eq(cos((delta+beta)/2)*cos(gamma/2),cos(theta/2))
result = solve([eq1, eq2, eq3], [delta, beta, gamma])
我的问题是基于最后一个参数t
。对于当前值,该函数应该是可解的,但它没有 return 任何结果。如果我将 t 的值更改为其他一些值,那么我可以得到结果。例如,如果 t=99
,那么结果看起来像
[(-12.0619298297468, 9.00000000000000, 7.46580816699663e-8*I),
(-12.0619298297468, 9.00000000000000, 12.5663706143592 - 7.46580045560101e-8*I)]
为什么我无法从第一个t值得到结果?我该如何解决这个问题?谢谢!!
In [59]:
...: delta, gamma = symbols('delta gamma')
...: theta = symbols('theta')
...: beta = 9
...: eq1 = Eq(tan((delta+beta)/2),nz*tan(theta/2))
...: #eq2 = Eq(ny*tan((delta-beta)/2),nx)
...: eq3 = Eq(cos((delta+beta)/2)*cos(gamma/2),cos(theta/2))
In [60]: eq1
Out[60]:
⎛δ 9⎞ ⎛θ⎞
tan⎜─ + ─⎟ = tan⎜─⎟
⎝2 2⎠ ⎝2⎠
In [61]: eq3
Out[61]:
⎛γ⎞ ⎛δ 9⎞ ⎛θ⎞
cos⎜─⎟⋅cos⎜─ + ─⎟ = cos⎜─⎟
⎝2⎠ ⎝2 2⎠ ⎝2⎠
In [62]: result = solve([eq1, eq3], [delta, gamma])
In [63]: result
Out[63]:
⎡⎛ ⎛ ____________ ⎞ ⎞ ⎛ ⎛
⎢⎜ ⎛ ⎛θ⎞⎞ ⎜ ╱ 1 ⎛θ⎞⎟ ⎟ ⎜ ⎛ ⎛θ⎞⎞ ⎜ ╱
⎢⎜2⋅atan⎜tan⎜─⎟⎟ - 9, - 2⋅acos⎜√2⋅ ╱ ────────── ⋅cos⎜─⎟⎟ + 4⋅π⎟, ⎜2⋅atan⎜tan⎜─⎟⎟ - 9, 2⋅acos⎜√2⋅ ╱
⎣⎝ ⎝ ⎝2⎠⎠ ⎝ ╲╱ cos(θ) + 1 ⎝2⎠⎠ ⎠ ⎝ ⎝ ⎝2⎠⎠ ⎝ ╲╱
____________ ⎞⎞⎤
1 ⎛θ⎞⎟⎟⎥
────────── ⋅cos⎜─⎟⎟⎟⎥
cos(θ) + 1 ⎝2⎠⎠⎠⎦
现在评估一些具有特定 theta
值的 result
项。
In [64]: result[0][0].subs({theta:-0.849})
Out[64]: -9.84900000000000
In [65]: result[0][1].subs({theta:-0.849})
Out[65]: -2⋅acos(0.707106781186547⋅√2) + 4⋅π
我没有看到任何关于为什么 result
对于 t
的某些值会为空(无解)的线索,因此 theta
。但是使用这个代数解应该更容易探索这些问题。
In [66]: t=9
In [67]: remainder(2*t*sqrt(b**2+c**2+d**2), tau)
Out[67]: -0.8495559215387587
acos
项可能是问题所在:
acos(0.707106781186547⋅√2)
这大约是 acos(1)
,但是 nan
如果 acos
arg 完全大于 1。
与numpy
:
In [299]: def foo(theta):
...: return np.sqrt(2)*np.sqrt(1/(np.cos(theta)+1))*np.cos(theta/2)
...:
In [300]: foo(0)
Out[300]: 1.0000000000000002
In [301]: foo(-1)
Out[301]: 1.0000000000000002
In [302]: foo(-.89)
Out[302]: 1.0000000000000002
In [303]: foo(-3.0)
Out[303]: 0.999999999999998
所以 acos
参数在代数上是 1,但数值上可能会大一点,导致 nan
.
这是我尝试使用 sympy
:
# Import sympy
from math import remainder, tau
from sympy import *
from sympy.solvers import solve
# Define the parameters
nx, ny, nz = [0,0,1]
a,b,c = [0,0,0]
d = 1
t = 9
# Solve the equations
theta = remainder(2*t*sqrt(b**2+c**2+d**2), tau)
delta, beta, gamma = symbols('delta beta gamma')
beta = 7 # Randomly assigned.
eq1 = Eq(tan((delta+beta)/2),nz*tan(theta/2))
eq2 = Eq(ny*tan((delta-beta)/2),nx)
eq3 = Eq(cos((delta+beta)/2)*cos(gamma/2),cos(theta/2))
result = solve([eq1, eq2, eq3], [delta, beta, gamma])
我的问题是基于最后一个参数t
。对于当前值,该函数应该是可解的,但它没有 return 任何结果。如果我将 t 的值更改为其他一些值,那么我可以得到结果。例如,如果 t=99
,那么结果看起来像
[(-12.0619298297468, 9.00000000000000, 7.46580816699663e-8*I),
(-12.0619298297468, 9.00000000000000, 12.5663706143592 - 7.46580045560101e-8*I)]
为什么我无法从第一个t值得到结果?我该如何解决这个问题?谢谢!!
In [59]:
...: delta, gamma = symbols('delta gamma')
...: theta = symbols('theta')
...: beta = 9
...: eq1 = Eq(tan((delta+beta)/2),nz*tan(theta/2))
...: #eq2 = Eq(ny*tan((delta-beta)/2),nx)
...: eq3 = Eq(cos((delta+beta)/2)*cos(gamma/2),cos(theta/2))
In [60]: eq1
Out[60]:
⎛δ 9⎞ ⎛θ⎞
tan⎜─ + ─⎟ = tan⎜─⎟
⎝2 2⎠ ⎝2⎠
In [61]: eq3
Out[61]:
⎛γ⎞ ⎛δ 9⎞ ⎛θ⎞
cos⎜─⎟⋅cos⎜─ + ─⎟ = cos⎜─⎟
⎝2⎠ ⎝2 2⎠ ⎝2⎠
In [62]: result = solve([eq1, eq3], [delta, gamma])
In [63]: result
Out[63]:
⎡⎛ ⎛ ____________ ⎞ ⎞ ⎛ ⎛
⎢⎜ ⎛ ⎛θ⎞⎞ ⎜ ╱ 1 ⎛θ⎞⎟ ⎟ ⎜ ⎛ ⎛θ⎞⎞ ⎜ ╱
⎢⎜2⋅atan⎜tan⎜─⎟⎟ - 9, - 2⋅acos⎜√2⋅ ╱ ────────── ⋅cos⎜─⎟⎟ + 4⋅π⎟, ⎜2⋅atan⎜tan⎜─⎟⎟ - 9, 2⋅acos⎜√2⋅ ╱
⎣⎝ ⎝ ⎝2⎠⎠ ⎝ ╲╱ cos(θ) + 1 ⎝2⎠⎠ ⎠ ⎝ ⎝ ⎝2⎠⎠ ⎝ ╲╱
____________ ⎞⎞⎤
1 ⎛θ⎞⎟⎟⎥
────────── ⋅cos⎜─⎟⎟⎟⎥
cos(θ) + 1 ⎝2⎠⎠⎠⎦
现在评估一些具有特定 theta
值的 result
项。
In [64]: result[0][0].subs({theta:-0.849})
Out[64]: -9.84900000000000
In [65]: result[0][1].subs({theta:-0.849})
Out[65]: -2⋅acos(0.707106781186547⋅√2) + 4⋅π
我没有看到任何关于为什么 result
对于 t
的某些值会为空(无解)的线索,因此 theta
。但是使用这个代数解应该更容易探索这些问题。
In [66]: t=9
In [67]: remainder(2*t*sqrt(b**2+c**2+d**2), tau)
Out[67]: -0.8495559215387587
acos
项可能是问题所在:
acos(0.707106781186547⋅√2)
这大约是 acos(1)
,但是 nan
如果 acos
arg 完全大于 1。
与numpy
:
In [299]: def foo(theta):
...: return np.sqrt(2)*np.sqrt(1/(np.cos(theta)+1))*np.cos(theta/2)
...:
In [300]: foo(0)
Out[300]: 1.0000000000000002
In [301]: foo(-1)
Out[301]: 1.0000000000000002
In [302]: foo(-.89)
Out[302]: 1.0000000000000002
In [303]: foo(-3.0)
Out[303]: 0.999999999999998
所以 acos
参数在代数上是 1,但数值上可能会大一点,导致 nan
.