如何获得每边面积相等的线?

时间:2013-03-11 22:13:46

标签: python numpy integration

An example of the areas I need

我需要找到一条分割点的线,使蓝色区域等于读取区域。我这样做是一个numpy数组,其中包含所有的x和y点。我试过将它拆分并占用各个部分的区域,但这证明我有多少分难。

我的另一个想法是把这个功能放在它的一边,然后整合那个方式,当积分为零时区域相等,但我找不到一个让我选择“x轴”的函数那种情况。任何人对我如何做到这一点都有任何建议吗?

[编辑]原始图片(在错误的颜色作业之前)

[编辑]

我正在使用的x值here 和那些值相同的y值是here

2 个答案:

答案 0 :(得分:1)

编辑以下代码在处理泛型函数方面不是很好,area_difference的其他版本更强大一些。如果传递的x0至少两次不与曲线相交,它仍然会失败。

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

如果将曲线定义为参数曲线,则可以获取该区域,数组的索引是参数。鉴于基本思想,我认为以下代码或多或少是直截了当的。我并没有过多地担心错误地解决一个错误,但任何差异都应该是微不足道的。

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

enter image description here

答案 1 :(得分:0)

我最后通过做一些相当简单的事情解决了我自己的问题。

从图像中可以看出,我将曲线分为顶部,中部和底部(此处用不同的颜色表示),然后在它们之间划一条分界线并做了一个Riemann Sum of various,移动直到区域相等的红线。