EDIT以下のコードは、ジェネリック関数を扱うのがあまり得意ではありません。この他のバージョンarea_difference
は、もう少し堅牢です。x0
渡された が少なくとも 2 回カーブと交差しない場合でも失敗します。
def area_difference(x0, x, y) :
transitions = np.where(np.diff(x < x0))[0]
x_ = x[transitions[0]:transitions[-1]]
y_ = y[transitions[0]:transitions[-1]]
return np.sum(np.diff(y_) * (x_[:-1] - x0))
曲線がパラメトリック曲線として定義され、配列のインデックスがパラメーターであると考えると、面積を取得できます。基本的な考え方を考えると、次のコードは多かれ少なかれ簡単だと思います。1 つずつエラーが正しく発生することについてはあまり心配していませんが、違いは小さいはずです。
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize
x = np.genfromtxt('x.txt')
y = np.genfromtxt('y.txt')
def area_difference(x0, x, y) :
transitions = np.where(np.diff(x < x0))
x_right = x[transitions[0][0]:transitions[0][1]]
y_right = y[transitions[0][0]:transitions[0][1]]
x_left = x[transitions[0][1]:transitions[0][2]]
y_left = y[transitions[0][1]:transitions[0][2]]
return (np.sum(np.diff(y_right) * (x_right[:-1] - x0)) +
np.sum(np.diff(y_left) * (x_left[:-1] - x0)))
x0 = scipy.optimize.fsolve(area_difference, 3, args=(x, y))
plt.plot(x, y, 'b-')
plt.plot([x0, x0], [y.min(), y.max()], 'r-')
plt.show()
>>> x0
array([ 3.4174168])