numpy 为什么np.linspace使用一个大的num会把交集的计算搞得一团糟?

qzwqbdag  于 2023-05-07  发布在  其他
关注(0)|答案(2)|浏览(183)

我正在尝试两个函数的一些计算/绘图。
使用

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 35, 50)
g = lambda x: 155 * (1 + (5/100)) ** (x - 1)
f = lambda x: np.where(x<=25, 200, 0)

plt.plot(x, f(x), '-')
plt.plot(x, g(x), '-')

idx = np.argwhere(np.diff(np.sign(f(x) - g(x)))).flatten()
plt.plot(x[idx], f(idx), 'ro')
plt.show()
print(x[idx],f(idx))

>>> [5.71428571] [200]

但是那个红点不在正确的位置(太靠左了)。
所以,假设问题是x值的数量,我改变x = np.linspace(0, 35, 100)并得到
>>>[6.01010101] [200]

这是更好的,但仍然有点小康,而且,在现实中,我想确切的解决方案。
但是,如果我改变x = np.linspace(0, 35, 200),我会突然得到
>>>[6.15577889] [0]

...这对我来说毫无意义。

yqyhoc1h

yqyhoc1h1#

g(x)的值:没有值等于200...

n = 50
           x        g(x)
7    5.000000  188.403469
8    5.714286  195.085103
9    6.428571  202.003699
10   7.142857  209.167659
-------------------------
n = 100
           x        g(x)
16  5.656566  194.536483
17  6.010101  197.921160
18  6.363636  201.364725
19  6.717172  204.868204
-------------------------
n = 200
           x        g(x)
34  5.979899  197.629730
35  6.155779  199.332925
36  6.331658  201.050798
37  6.507538  202.783475

提示:使用一些函数来解方程。。

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import root_scalar

x = np.linspace(0, 35, 200)
g = lambda x: 155 * (1 + (5/100)) ** (x - 1)
f = lambda x: np.where(x<=25, 200, 0)
h = lambda x: f(x) - g(x)

plt.plot(x, f(x), '-')
plt.plot(x, g(x), '-')

idx = np.argwhere(np.diff(np.sign(f(x) - g(x)))).flatten()
sol_object = root_scalar(h, bracket=[0., 10.])
x_root = sol_object.root

plt.plot(x[idx], f(x[idx]), 'ro', label='f(x[idx])')
plt.plot(x[idx], g(x[idx]), 'rx', label='g(x[idx])')
plt.plot(x_root, g(x_root), 'rD', label='g(x_root)')

plt.xlim(5., 7.5)
plt.ylim(100, 300)
plt.legend()

plt.show()
print(x[idx], f(x[idx]), g(x[idx]))
print(x_root, f(x_root), g(x_root))

nnvyjq4y

nnvyjq4y2#

你的点的x坐标对我来说看起来很好,只是y位置不好。
看起来你正在绘制f_i(第i个索引),而不是f(x)x的第i个位置上f的求值)。
请绘制plt.plot(x[idx], f(x[idx]), 'ro'),而不是f(idx)

相关问题