SymPy中更难的方程式(带有导数和积分)和ConditionSet

我打算计算从0到x的曲线(函数)长度等于1的b(在Xo轴上也为x)。

在知道的情况下:https://www.mathsisfun.com/calculus/arc-length.html

(从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就像我说的是Xo轴上的x。

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

F(b)等于这个怪物:https://www.wolframalpha.com/input/?i=integral&assumption=%7B%22C%22%2C+%22integral%22%7D+-%3E+%7B%22Calculator%22%7D&assumption=%7B%22F%22%2C+%22Integral%22%2C+%22integrand%22%7D+-%3E%22%281+%2B+9x%5E4%29%5E%281%2F2%29%22

我从SymPy获得的全部是ConditionSet,但不是数字。当然,不能通过evalf()撤消ConditionSet

所以这是我的问题:

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

代码:

from __future__ import division
import matplotlib.pyplot as plt
from sympy import *

x,y,z = symbols('x y z',real=True)

function1 = x**3

Antiderivative1 = integrate((1+(diff(function1))**2)**(1/2),x)

b = solveset(Eq(1 + Antiderivative1.subs(x,0).evalf() - Antiderivative1,0),x)

print(b)

多数民众赞成在输出:

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),Complexes)

在此先感谢您,感谢语法错误。

fc3svsae86 回答:SymPy中更难的方程式(带有导数和积分)和ConditionSet

请注意,您应该使用S(1)/2Rational(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上的结果,我非常怀疑您会找到一种分析解决方案(使用SymPy或其他方法)。

但是,您可以找到一个数值解。不幸的是,SymPy的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
本文链接:https://www.f2er.com/2839788.html

大家都在问