在 python 中使用 sympy 微分绝对值函数不会 return 一个答案
Differentiating absolute value functions using sympy in python won't return an answer
我试图找到 tanh(x)
函数的最大曲率点,但曲率的数学定义包含绝对值函数。我已经指定 x 必须是实值,这解决了 sympy returning 曲率导数的虚函数。但是,当尝试使用 sym.solve()
方法求解 k'(x)=0
时,python 将简单地继续 运行 而不是 return 一个答案。
x = sym.symbols('x', real=True)
# below are parameters I found from curve fitting raw data elsewhere that are just converted to sympy variables
a = sym.Float(a)
b = sym.Float(b)
c = sym.Float(c)
d = sym.Float(d)
# function in question
def f(x):
return a * sym.tanh(b * x + c) + d
def fprime(x):
return sym.diff(f(x),x,1)
def f2prime(x):
return sym.diff(f(x),x,2)
f1 = fprime(x)
f2 = f2prime(x)
# mathematical definition of curvature
def kappa(f1,f2):
return sym.Abs(f2) / ( 1 + f1**2 )**(3/2)
def kprime(f1,f2):
return sym.diff(kappa(f1,f2),x,1)
k1 = kprime(f1,f2)
print(k1)
常量 a,b,c,d=[-2.40402847 -3.20154993 0.51489147 -8.05771537]
和 k1
的一个组合是
0.324273723818531*(1 - tanh(0.514891472285591 - 3.2015499273203*x)**2)*((1 - tanh(0.514891472285591 - 3.2015499273203*x)**2)**2 + 0.0168810800591381)**(-2.5)*(6.40309985464061*tanh(0.514891472285591 - 3.2015499273203*x)**2 - 6.40309985464061)*tanh(0.514891472285591 - 3.2015499273203*x)*Abs((tanh(3.2015499273203*x - 0.514891472285591)**2 - 1)*tanh(3.2015499273203*x - 0.514891472285591)) + 0.108091241272844*((3.2015499273203 - 3.2015499273203*tanh(3.2015499273203*x - 0.514891472285591)**2)*(tanh(3.2015499273203*x - 0.514891472285591)**2 - 1) + (6.40309985464061 - 6.40309985464061*tanh(3.2015499273203*x - 0.514891472285591)**2)*tanh(3.2015499273203*x - 0.514891472285591)**2)*((1 - tanh(0.514891472285591 - 3.2015499273203*x)**2)**2 + 0.0168810800591381)**(-1.5)*sign((tanh(3.2015499273203*x - 0.514891472285591)**2 - 1)*tanh(3.2015499273203*x - 0.514891472285591))
然后尝试使用 print(sym.solve(k1),x)
解决 x 的问题 return 永远无法得到答案。
这是一个漂亮的 high-order 非线性方程。尝试 nsolve
:
>>> nsolve(k1, -.5)
-0.427127686132521
我试图找到 tanh(x)
函数的最大曲率点,但曲率的数学定义包含绝对值函数。我已经指定 x 必须是实值,这解决了 sympy returning 曲率导数的虚函数。但是,当尝试使用 sym.solve()
方法求解 k'(x)=0
时,python 将简单地继续 运行 而不是 return 一个答案。
x = sym.symbols('x', real=True)
# below are parameters I found from curve fitting raw data elsewhere that are just converted to sympy variables
a = sym.Float(a)
b = sym.Float(b)
c = sym.Float(c)
d = sym.Float(d)
# function in question
def f(x):
return a * sym.tanh(b * x + c) + d
def fprime(x):
return sym.diff(f(x),x,1)
def f2prime(x):
return sym.diff(f(x),x,2)
f1 = fprime(x)
f2 = f2prime(x)
# mathematical definition of curvature
def kappa(f1,f2):
return sym.Abs(f2) / ( 1 + f1**2 )**(3/2)
def kprime(f1,f2):
return sym.diff(kappa(f1,f2),x,1)
k1 = kprime(f1,f2)
print(k1)
常量 a,b,c,d=[-2.40402847 -3.20154993 0.51489147 -8.05771537]
和 k1
的一个组合是
0.324273723818531*(1 - tanh(0.514891472285591 - 3.2015499273203*x)**2)*((1 - tanh(0.514891472285591 - 3.2015499273203*x)**2)**2 + 0.0168810800591381)**(-2.5)*(6.40309985464061*tanh(0.514891472285591 - 3.2015499273203*x)**2 - 6.40309985464061)*tanh(0.514891472285591 - 3.2015499273203*x)*Abs((tanh(3.2015499273203*x - 0.514891472285591)**2 - 1)*tanh(3.2015499273203*x - 0.514891472285591)) + 0.108091241272844*((3.2015499273203 - 3.2015499273203*tanh(3.2015499273203*x - 0.514891472285591)**2)*(tanh(3.2015499273203*x - 0.514891472285591)**2 - 1) + (6.40309985464061 - 6.40309985464061*tanh(3.2015499273203*x - 0.514891472285591)**2)*tanh(3.2015499273203*x - 0.514891472285591)**2)*((1 - tanh(0.514891472285591 - 3.2015499273203*x)**2)**2 + 0.0168810800591381)**(-1.5)*sign((tanh(3.2015499273203*x - 0.514891472285591)**2 - 1)*tanh(3.2015499273203*x - 0.514891472285591))
然后尝试使用 print(sym.solve(k1),x)
解决 x 的问题 return 永远无法得到答案。
这是一个漂亮的 high-order 非线性方程。尝试 nsolve
:
>>> nsolve(k1, -.5)
-0.427127686132521