首页 > 解决方案 > 如何显示 f(x) 以及朝向 f(xd) 和 f(x+d) 的斜率,中间值未知?

问题描述

在此处输入图像描述

假设 x 是 x 轴上我的元素的元素之一。现在假设对于常数 d,让right-slope = [f(x+d)-f(x)]/dleft-slope = [f(x)-f(x-d)]/d,对于x我们知道的每个 。

我想要的是在 处绘制一个标记(如图中的菱形或加号)B = (x,f(x)),而 B 左侧(AB)和右侧(BC)的段应分别代表左斜率和右斜率,即的坡度AB应为左坡,BC 的坡度应为右坡。

我认为这基本上归结为:你知道你的 x 数组中f(x)的每一个。x你也知道f(x-d)f(x+d)对于所有这些x,给定一个小常数d。现在您要绘制这样的图,仅[x-d,f(x-d)],[x,f(x)], [x+d,f(x+d)]由一条线连接每个x

我如何才能以这种方式为所有此类元素绘制图表,例如x在 python 中的 x 数组中?

标签: pythonmatplotlib

解决方案


以下方法为 中fn的每个条目创建 4 个条目f。第一个对应于左值,第二个对应于 f 值本身,第三个对应于右值,第四个是np.nan. 请注意,当nan在绘图命令中遇到时,会创建一个间隙。有 4 个对应的 x 值,一个在 xd,一个在 x,一个在 x+d,一个不重要,因为不会被绘制。

以下代码首先从正弦函数 ( sin(x^2)) 创建一些测试数据。实际上,这些值将来自更复杂的计算。

如果你只有斜率,你可以计算f_right = f + right_slope*d。和类似的f_left = f - left_slope*d

from matplotlib import pyplot as plt
import numpy as np

d = .04
x = np.linspace(0, 4, 20)
f = np.sin(x ** 2)
f_left = np.sin((x - d) ** 2)
f_right = np.sin((x + d) ** 2)

xn = np.repeat(x, 4)
xn[::4] -= d
xn[2::4] += d

fn = np.column_stack([f_left, f, f_right, np.full_like(f, np.nan)]).ravel()

plt.plot(x, f, marker='D', ls='', color='crimson')
plt.plot(xn, fn, color='navy')
plt.show()

示例图


推荐阅读