3

我需要的区域示例.

我需要找到一条分割点的线,使蓝色区域等于读取区域。我正在对一个包含所有 x 和 y 点的 numpy 数组执行此操作。我曾尝试将其拆分并获取各个部分的区域,但这对于我有多少分来说是很困难的。

我的另一个想法是将这个函数放在一边,并以这种方式积分,当积分为零时面积将相等,但在这种情况下我找不到让我选择“x轴”的函数。有人对我如何做这件事有任何建议吗?

[编辑] 原始图片(糟糕的颜色作业之前)

[编辑]

我正在使用的 x 值可以在此处找到 ,与之一起使用的 y 值在此处

4

2 回答 2

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

在此处输入图像描述

于 2013-03-12T00:13:30.837 回答
0

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

如图所示,我将曲线分成顶部、中间和底部(这里用不同的颜色表示),然后在它们之间画一条分界线,然后进行各种黎曼和,移动红线直到面积相等。

于 2013-03-14T20:45:02.670 回答