.
我需要找到一条分割点的线,使蓝色区域等于读取区域。我正在对一个包含所有 x 和 y 点的 numpy 数组执行此操作。我曾尝试将其拆分并获取各个部分的区域,但这对于我有多少分来说是很困难的。
我的另一个想法是将这个函数放在一边,并以这种方式积分,当积分为零时面积将相等,但在这种情况下我找不到让我选择“x轴”的函数。有人对我如何做这件事有任何建议吗?
[编辑] 原始图片(糟糕的颜色作业之前)
[编辑]
.
我需要找到一条分割点的线,使蓝色区域等于读取区域。我正在对一个包含所有 x 和 y 点的 numpy 数组执行此操作。我曾尝试将其拆分并获取各个部分的区域,但这对于我有多少分来说是很困难的。
我的另一个想法是将这个函数放在一边,并以这种方式积分,当积分为零时面积将相等,但在这种情况下我找不到让我选择“x轴”的函数。有人对我如何做这件事有任何建议吗?
[编辑] 原始图片(糟糕的颜色作业之前)
[编辑]
编辑下面的代码不太擅长处理泛型函数,这个其他版本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])