Python 辛中的Harder方程(带导数和积分)和条件集

Python 辛中的Harder方程(带导数和积分)和条件集,python,math,sympy,symbolic-math,integral,Python,Math,Sympy,Symbolic Math,Integral,我计划计算b(它也是Xo轴上的x),从0到x的曲线(函数)长度等于1 通过了解: (从0到b的积分)∫ (1+((f’(x))^2^(1/2)dx=1 而且: (从a积分到b)∫ f(x)dx=f(b)-f(a) 我们可以用 1-F(0)+F(b)=0,这是一个关于x的方程,因为正如我所说的,b是x轴上的x 所以现在我尝试了f(x)=x**3(下面是完整的代码) F(b)等于这个怪物: 我从Symphy得到的只是条件集,而不是数字。当然,条件集不能由evalf()求值 下面是我的问题: 我在数

我计划计算b(它也是Xo轴上的x),从0到x的曲线(函数)长度等于1

通过了解:

(从0到b的积分)∫ (1+((f’(x))^2^(1/2)dx=1

而且:

(从a积分到b)∫ f(x)dx=f(b)-f(a)

我们可以用

1-F(0)+F(b)=0,这是一个关于x的方程,因为正如我所说的,b是x轴上的x

所以现在我尝试了f(x)=x**3(下面是完整的代码)

F(b)等于这个怪物:

我从Symphy得到的只是条件集,而不是数字。当然,条件集不能由evalf()求值

下面是我的问题:

  • 我在数学上犯了错误吗
  • 我的代码错了吗?如何改进
  • SymPy足以计算这个吗
  • 我是否误解了文档
代码:

这就是输出:

ConditionSet(x, Eq(x*hyper((-0.5, 1/4), (5/4,), 9*x**4*exp_polar(I*pi)) - 4.0*gamma(5/4)/gamma(1/4), 0), Complexes)

提前感谢您并为语法错误感到抱歉。

请注意,您应该使用
S(1)/2
Rational(1,2)
(或
sqrt
),而不是
1/2
,这将在Python中为您提供一个
float

In [16]: integrand = sqrt(1 + ((x**3).diff(x))**2)                                                                                

In [17]: integrand                                                                                                                
Out[17]: 
   __________
  ╱    4     
╲╱  9⋅x  + 1 

In [18]: antiderivative = integrand.integrate(x)                                                                                  

In [19]: antiderivative                                                                                                           
Out[19]: 
          ┌─  ⎛-1/2, 1/4 │    4  ⅈ⋅π⎞
x⋅Γ(1/4)⋅ ├─  ⎜          │ 9⋅x ⋅ℯ   ⎟
         2╵ 1 ⎝   5/4    │          ⎠
─────────────────────────────────────
               4⋅Γ(5/4) 
虽然这与Wolfram Alpha的结果形式不同,但它很容易是相同的函数(直到一个加法常数)。从这个结果或Wolfram Alpha的结果来看,我非常怀疑你是否能找到解析解(使用Symphy或其他任何东西)

但是,您可以找到一个数值解。不幸的是,Symphy的
lambdify
函数中存在一个错误,这意味着
nsolve
无法使用此函数:

In [22]: nsolve(equation, x, 1)                                                                                                   
...
NameError: name 'exp_polar' is not defined
不过,我们可以使用牛顿步骤自己完成:

In [76]: f = equation.lhs                                                                                                         

In [77]: fd = f.diff(x)                                                                                                           

In [78]: newton = lambda xi: (xi - f.subs(x, xi)/fd.subs(x, xi)).evalf()                                                          

In [79]: xj = 1.0                                                                                                                 

In [80]: xj = newton(xj); print(xj)                                                                                               
0.826749667942050

In [81]: xj = newton(xj); print(xj)                                                                                               
0.791950624620750

In [82]: xj = newton(xj); print(xj)                                                                                               
0.790708415511451

In [83]: xj = newton(xj); print(xj)                                                                                               
0.790706893629886

In [84]: xj = newton(xj); print(xj)                                                                                               
0.790706893627605

In [85]: xj = newton(xj); print(xj)                                                                                               
0.790706893627605

非凡的解决方案,有这么多需要发现:)非常感谢:)
In [76]: f = equation.lhs                                                                                                         

In [77]: fd = f.diff(x)                                                                                                           

In [78]: newton = lambda xi: (xi - f.subs(x, xi)/fd.subs(x, xi)).evalf()                                                          

In [79]: xj = 1.0                                                                                                                 

In [80]: xj = newton(xj); print(xj)                                                                                               
0.826749667942050

In [81]: xj = newton(xj); print(xj)                                                                                               
0.791950624620750

In [82]: xj = newton(xj); print(xj)                                                                                               
0.790708415511451

In [83]: xj = newton(xj); print(xj)                                                                                               
0.790706893629886

In [84]: xj = newton(xj); print(xj)                                                                                               
0.790706893627605

In [85]: xj = newton(xj); print(xj)                                                                                               
0.790706893627605