我需要找到一条分割点的线,使蓝色区域等于读取区域。我这样做是一个numpy数组,其中包含所有的x和y点。我试过将它拆分并占用各个部分的区域,但这证明我有多少分难。
我的另一个想法是把这个功能放在它的一边,然后整合那个方式,当积分为零时区域相等,但我找不到一个让我选择“x轴”的函数那种情况。任何人对我如何做到这一点都有任何建议吗?
[编辑]原始图片(在错误的颜色作业之前)
[编辑]
答案 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])
答案 1 :(得分:0)