Python 辛中的Harder方程(带导数和积分)和条件集
我计划计算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()求值 下面是我的问题: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()求值 下面是我的问题: 我在数
- 我在数学上犯了错误吗
- 我的代码错了吗?如何改进
- 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