scipy 在Python中用离散点做Riemann求和

zbsbpyhn  于 2023-10-20  发布在  Python
关注(0)|答案(2)|浏览(138)

我有一个由许多点组成的数据集(大约百万到万亿),它将[x1,x2,x3]Map到向量[y1,y2,y3],我想计算这个函数的黎曼和。
我不知道这是否有帮助,但所有x1,x2,x3都以[0,1]为界。有没有一个Python模块或一个简单的方法来做到这一点?
先谢谢你了。

yyhrrdl8

yyhrrdl81#

这里有一个简单的程序,计算左黎曼和。这假设向量中给定的值按x值的递增顺序排序。

integral_value = 0
for i in range(len(x) - 1):
    width = x[i + 1] - x[i]
    
    # Replace with y[i + 1] for right Riemann sum.
    # Or, replace with (y[i] + y[i + 1]) / 2 for midpoint Riemann sum.
    height = y[i]
    integral_value += width * height
qvtsj1bj

qvtsj1bj2#

我假设OP问题中的X值不是均匀分布的。如果是这样的话,我用Pandas做。首先模拟OP数据:

import numpy as np
import datetime

dx1 = 10**(-8)
dx2 = dx1*0.3
X = np.sort(np.concatenate((np.arange(0,1,dx1),np.arange(dx2,1,dx2))))
X = X[np.concatenate(([True],np.diff(X) > 10**(-15)))]
Y = np.pi*np.sin(np.pi*X)/2

然后,

import pandas as pd

# Place everything in a dataframe. X is placed directly in the index.
data = pd.DataFrame(Y,columns = ['Y'], index = X)
# New columns with the intervals between dx and the average of pairs or consecutive points
data['dx'] = pd.Series(data.index-data.index[0]).diff().values
data['2pt_average'] = (data['Y'] + data['Y'].shift(1))/2

print('Integral:',(data['dx']*data['2pt_average']).sum())

> Integral: 0.9999999999999907

这利用了pandas中的优化循环。这可能是最快的方法之一。我可以将dx减少到10^(-8),这导致4亿个数据点。达到万亿规模将更加困难。
如果你跳过“dx”和“2pt_average”列的定义,你可以更有效率一点:

import pandas as pd

data = pd.DataFrame(Y,columns = ['Y'], index = X)
print('Integral:',((pd.Series(data.index-data.index[0]).diff().values)*((data['Y'] + data['Y'].shift(1))/2)).sum())

> Integral: 0.9999999999999907

相关问题