如何计算定积分并取回python的数值?
How to calculate definite integral and get back a numerical value with python?
我正在用 python 做一些复杂的积分,我需要结果是一个数值,例如 2003708.58843。现在我的 python 程序给出了一些非常奇怪的结果,其中包含一些 "hyper" 函数等。如果有人能帮助我,我将不胜感激。
当前节目在这里:
import sympy as sp
x = sp.symbols('x')
f1 = 5000 + ((-(-7000+x)*(-3000+x))**(1/2))
f2 = 5000 - ((-(-7000+x)*(-3000+x))**(1/2))
minimum1 = 3000
maximum1 = (500/3)*(35-2*((61)**(1/2)))
int1 = sp.integrate(f1, (x,minimum1,maximum1))
int2 = sp.integrate(f2, (x,minimum1,maximum1))
minimum2 = (500/3)*(35-2*((61)**(1/2)))
maximum2 = 4500
f3 = 5000 + (1/2)*((-(-4500+x)*(-500+x))**(1/2))
f4 = 5000 - (1/2)*((-(-4500+x)*(-500+x))**(1/2))
int3 = sp.integrate(f3, (x,minimum2,maximum2))
int4 = sp.integrate(f4, (x,minimum2,maximum2))
I1 = int1-int2
I2 = int3-int4
total = I1 + I2
print(total)
试试这个:
from scipy.integrate import quad
def integrand(x):
return x**2
ans, err = quad(integrand, 0, 1)
print ans
只需将 integrand
函数更改为您想要的任何值,并将 1, 0
更改为您想要的集成限制。
代码取自 here。
当使用 sympy 时,你应该小心使用浮点数,例如1/2
而是使用精确的有理数,例如Rational(1, 2)
。改变我得到的:
In [2]: import sympy as sp
In [3]: x = sp.symbols('x')
...: f1 = 5000 + ((-(-7000+x)*(-3000+x))**(Rational(1, 2)))
...: f2 = 5000 - ((-(-7000+x)*(-3000+x))**(Rational(1, 2)))
...: minimum1 = 3000
...: maximum1 = (Rational(500, 3))*(35-2*((61)**(Rational(1, 2))))
...: int1 = sp.integrate(f1, (x,minimum1,maximum1))
In [4]: int1
Out[4]:
_________________ 5/2 3/2 ⎛ _________________⎞
╱ 8500 1000⋅√61 ⎛8500 1000⋅√61⎞ ⎛8500 1000⋅√61⎞ ⎜ ╱ 8500 1000⋅√61 ⎟
4000000⋅ ╱ ──── - ──────── ⎜──── - ────────⎟ 3000⋅⎜──── - ────────⎟ ⎜√10⋅ ╱ ──── - ──────── ⎟
5000000⋅√61 ╲╱ 3 3 ⎝ 3 3 ⎠ ⎝ 3 3 ⎠ ⎜ ╲╱ 3 3 ⎟ 42500000
- ─────────── - ───────────────────────────── - ─────────────────────── + ───────────────────────── + 4000000⋅asin⎜─────────────────────────⎟ + ────────
3 _________________ _________________ _________________ ⎝ 200 ⎠ 3
╱ 3500 1000⋅√61 ╱ 3500 1000⋅√61 ╱ 3500 1000⋅√61
╱ ──── + ──────── 2⋅ ╱ ──── + ──────── ╱ ──── + ────────
╲╱ 3 3 ╲╱ 3 3 ╲╱ 3 3
如果你想计算浮点数到 15 位十进制数字的结果,那么你可以这样做:
In [5]: int1.evalf()
Out[5]: 1294014.90427420
要直接使用数值求积法(类似于 snatchysquid 的答案)计算近似数值结果,您可以这样做
In [6]: sp.Integral(f1, (x, minimum1, maximum1)).evalf()
Out[6]: 1294014.90427420
我正在用 python 做一些复杂的积分,我需要结果是一个数值,例如 2003708.58843。现在我的 python 程序给出了一些非常奇怪的结果,其中包含一些 "hyper" 函数等。如果有人能帮助我,我将不胜感激。
当前节目在这里:
import sympy as sp
x = sp.symbols('x')
f1 = 5000 + ((-(-7000+x)*(-3000+x))**(1/2))
f2 = 5000 - ((-(-7000+x)*(-3000+x))**(1/2))
minimum1 = 3000
maximum1 = (500/3)*(35-2*((61)**(1/2)))
int1 = sp.integrate(f1, (x,minimum1,maximum1))
int2 = sp.integrate(f2, (x,minimum1,maximum1))
minimum2 = (500/3)*(35-2*((61)**(1/2)))
maximum2 = 4500
f3 = 5000 + (1/2)*((-(-4500+x)*(-500+x))**(1/2))
f4 = 5000 - (1/2)*((-(-4500+x)*(-500+x))**(1/2))
int3 = sp.integrate(f3, (x,minimum2,maximum2))
int4 = sp.integrate(f4, (x,minimum2,maximum2))
I1 = int1-int2
I2 = int3-int4
total = I1 + I2
print(total)
试试这个:
from scipy.integrate import quad
def integrand(x):
return x**2
ans, err = quad(integrand, 0, 1)
print ans
只需将 integrand
函数更改为您想要的任何值,并将 1, 0
更改为您想要的集成限制。
代码取自 here。
当使用 sympy 时,你应该小心使用浮点数,例如1/2
而是使用精确的有理数,例如Rational(1, 2)
。改变我得到的:
In [2]: import sympy as sp
In [3]: x = sp.symbols('x')
...: f1 = 5000 + ((-(-7000+x)*(-3000+x))**(Rational(1, 2)))
...: f2 = 5000 - ((-(-7000+x)*(-3000+x))**(Rational(1, 2)))
...: minimum1 = 3000
...: maximum1 = (Rational(500, 3))*(35-2*((61)**(Rational(1, 2))))
...: int1 = sp.integrate(f1, (x,minimum1,maximum1))
In [4]: int1
Out[4]:
_________________ 5/2 3/2 ⎛ _________________⎞
╱ 8500 1000⋅√61 ⎛8500 1000⋅√61⎞ ⎛8500 1000⋅√61⎞ ⎜ ╱ 8500 1000⋅√61 ⎟
4000000⋅ ╱ ──── - ──────── ⎜──── - ────────⎟ 3000⋅⎜──── - ────────⎟ ⎜√10⋅ ╱ ──── - ──────── ⎟
5000000⋅√61 ╲╱ 3 3 ⎝ 3 3 ⎠ ⎝ 3 3 ⎠ ⎜ ╲╱ 3 3 ⎟ 42500000
- ─────────── - ───────────────────────────── - ─────────────────────── + ───────────────────────── + 4000000⋅asin⎜─────────────────────────⎟ + ────────
3 _________________ _________________ _________________ ⎝ 200 ⎠ 3
╱ 3500 1000⋅√61 ╱ 3500 1000⋅√61 ╱ 3500 1000⋅√61
╱ ──── + ──────── 2⋅ ╱ ──── + ──────── ╱ ──── + ────────
╲╱ 3 3 ╲╱ 3 3 ╲╱ 3 3
如果你想计算浮点数到 15 位十进制数字的结果,那么你可以这样做:
In [5]: int1.evalf()
Out[5]: 1294014.90427420
要直接使用数值求积法(类似于 snatchysquid 的答案)计算近似数值结果,您可以这样做
In [6]: sp.Integral(f1, (x, minimum1, maximum1)).evalf()
Out[6]: 1294014.90427420