【问题标题】:How do I get a line where the area on each side is equal?如何获得每边面积相等的线?
【发布时间】:2013-02-27 06:53:30
【问题描述】:

.

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

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

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

[编辑]

我使用的 x 值可以在 here 找到 y 值是here

【问题讨论】:

  • 数据是什么格式的? (想必不只是一张图……)
  • 这是一个 numpy 数组,一个相当长的一维浮点数数组,由高斯函数生成。
  • 你试过二分搜索吗?
  • 您能否展示一个可重现的数组示例,以便我们试一试? (否则我们将不得不生成我们自己的数据)
  • @DavidRobinson 我已将其发布在 pastebin 以及有关如何生成它的更多信息。

标签: python numpy integration


【解决方案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])

【讨论】:

  • 你今天帮了我很多,但我仍然有这个问题。如果我减少此函数运行的时间量(即此循环的顶部将更靠左),我会得到无法修复的 IndexErrors。或者如果我使用不同的函数,比如正弦波。有什么建议吗?
  • @NightHallow 我用更强大的area_difference 函数版本编辑了我的答案。关键是要对与曲线相交至少两次的fsolve 进行初始猜测。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 2018-07-04
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2020-05-16
    • 2020-01-11
    相关资源
    最近更新 更多