web-dev-qa-db-ja.com

関数を知らなくても、座標セットが与えられた曲線の下の面積を計算する

Y軸の高さとX軸の長さとして、100の数字のリストが1つあります:一定のステップ5で1〜100。(x、y)の曲線に含まれる面積を計算する必要があります。ポイント、X軸、長方形とScipyを使用します。この曲線の関数を見つける必要がありますか?か否か? ...私が読んだほとんどすべての例は、Y軸の特定の方程式に関するものです。私の場合、方程式はなく、リストのデータのみです。古典的な解決策は、YポイントとステップX距離で複数のポイントを追加することです... Scipyを使用して何かアイデアがありますか?

ScipyとNumpyを使用して、数値(有限基本)方法に焦点を当てた本を誰かお勧めできますか? ...

38
user1640255

Numpyおよびscipyライブラリには、複合台形( numpy.trapz )およびSimpsonの( scipy.integrate.simps )ルールが含まれています。

以下に簡単な例を示します。 trapzsimpsの両方で、引数dx=5は、x軸に沿ったデータの間隔が5単位であることを示します。

from __future__ import print_function

import numpy as np
from scipy.integrate import simps
from numpy import trapz


# The y values.  A numpy array is used here,
# but a python list could also be used.
y = np.array([5, 20, 4, 18, 19, 18, 7, 4])

# Compute the area using the composite trapezoidal rule.
area = trapz(y, dx=5)
print("area =", area)

# Compute the area using the composite Simpson's rule.
area = simps(y, dx=5)
print("area =", area)

出力:

area = 452.5
area = 460.0
55

Simpsons rule または Trapezium rule を使用して、一定間隔でy値のテーブルが与えられたグラフの下の面積を計算できます。

Simpsonsルールを計算するPythonスクリプト:

def integrate(y_vals, h):
    i = 1
    total = y_vals[0] + y_vals[-1]
    for y in y_vals[1:-1]:
        if i % 2 == 0:
            total += 2 * y
        else:
            total += 4 * y
        i += 1
    return total * (h / 3.0)

hはy値間のオフセット(またはギャップ)であり、y_valsは、Y値のウェルの配列です。

例(上記の関数と同じファイル内):

y_values = [13, 45.3, 12, 1, 476, 0]
interval = 1.2
area = integrate(y_values, interval)
print("The area is", area)
17
Will Richardson

Sklearnがインストールされていない場合、sklearn.metrics.aucを使用するのが簡単な方法です

これは、任意のxおよびy配列が与えられた台形規則を使用して曲線下の面積を計算します

import numpy as np
from sklearn.metrics import auc

dx = 5
xx = np.arange(1,100,dx)
yy = np.arange(1,100,dx)

print('computed AUC using sklearn.metrics.auc: {}'.format(auc(xx,yy)))
print('computed AUC using np.trapz: {}'.format(np.trapz(yy, dx = dx)))

両方が同じ領域を出力します:4607.5

sklearn.metrics.aucの利点は、任意の間隔の 'x'配列を受け入れることができることです。それが昇順であることを確認するだけです。そうしないと、結果が不正確になります。

4
khuang834