我知道如何用蒙特卡罗来计算积分,但我想知道是否可以用梯形规则和numpy法则相结合来得到同样的积分,我不知道哪一个是最快的,还是后者可能的?
例如,为了集成e**-x**2 > y
,我可以使用蒙特卡罗方法,如下所示:
import numpy as np
import matplotlib.pyplot as plt
X = np.random.rand(500000,2)
X[:,0] = X[:,0]*4-2
J = np.where(X[:,1] < np.exp(-X[:,0]**2))[0]
Xp = X[:2000]
Ip = [i for i in range(len(Xp)) if i in J]
Inp = [i for i in range(len(Xp)) if i not in J]
plt.plot(Xp[Ip,0],Xp[Ip,1], 'bd', Xp[Inp,0],Xp[Inp,1], 'rd')
plt.show()
这可以很容易地计算:
print len(J) / 500000.0 * 4
这意味着:
1.767784
在这种情况下,这很容易,但是如果没有在[a,b] , n
中指定间隔,并且我想要创建一个函数,那么我认为上面的方法并不是真正有效的,至少我认为是这样的。
那么,我的问题是,我能不能把像cos(x)/x
这样的连续函数集成到带有梯形规则的函数中,比如[a,b]
这样的确定区间?
这比我在这里用的方法好吗?
每一个建议都是受欢迎的。
发布于 2018-05-17 07:57:33
只需使用scipy.integrate.quad
from scipy import integrate
from np import inf
from math import exp, sqrt, pi
res, errEstimate = integrate.quad(lambda x: exp(-x**2), -inf, +inf)
print(res) #output: 1.7724538509055159
print(sqrt(pi)) #output: 1.7724538509055159
最后一行简单地检查求值积分是否确实是Pi的平方根(它是高斯积分)。
发布于 2018-10-12 13:44:24
你也可以使用黎曼近似。下面的代码是用Java编写的
package math;
import java.util.Optional;
import java.util.function.*;
import java.util.stream.IntStream;
import static java.lang.Math.*;
public class IntegralJava8
{
public interface Riemann extends BiFunction<Function<Double, Double>, Integer,
BinaryOperator<Double>> { }
public static void main(String args[])
{
int N=100000;
Riemann s = (f, n) -> (a, b) ->
IntStream.range(0, n)
.mapToDouble(i -> f.apply(a + i * ((b - a) / n)) * ((b - a) / n)).sum();
Optional<Double> gaussIntegral =
Optional.of(s.apply(x -> exp(-pow(x, 2)), N).apply(-1000.0, 1000.0));
gaussIntegral.ifPresent(System.out::println);
}
}
在上述类中,它将计算从-infinity到无穷大的高斯积分,它等于PI (1.772)的平方根。
https://stackoverflow.com/questions/50395475
复制相似问题