3

必要な領域の例.

青い領域が読み取り領域と等しくなるように、点を分割する線を見つける必要があります。すべての x 点と y 点を含む numpy 配列に対してこれを行っています。分割して各パーツの面積をとってみましたが、点数的に難しいです。

私の他のアイデアは、この関数を横に置き、そのように積分することでした。積分がゼロの場合、面積は等しくなりますが、その場合、「x軸」を選択できる関数が見つかりません。どうすればこれを行うことができるかについて、誰かアドバイスがありますか?

【編集】原画(色落ち前)

[編集]

私が使用しているx値はここで見つけることができ 、それらに沿ったy値はここにあります

4

2 に答える 2

1

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])

ここに画像の説明を入力

于 2013-03-12T00:13:30.837 に答える
0

私はかなり単純なことをすることで自分の問題を解決することになりました。

画像に見られるように、曲線を上、中、下のセクション (ここでは異なる色で表されています) に分割し、それらの間に分割線を入れて、ある種のリーマン和を実行し、赤い線を面積は等しかった。

于 2013-03-14T20:45:02.670 に答える