为何增大np.linspace采样数会破坏函数交点计算结果?
问题分析与解决方案
为什么采样数200时f(idx)返回0?
你混淆了数组索引和实际x值:idx是x数组的下标位置,不是x的取值。当你调用f(idx)时,是把下标数字(比如35左右)当作x传入函数,而35>25,所以f(x)返回0。正确的写法应该是f(x[idx]),这样才是取交点对应的实际x值代入计算。
如何获取精确交点?
因为x≤25时f(x)=200,所以只需解方程:155*(1.05)^(x-1) = 200
代数精确求解
通过对数变换直接计算:
x = 1 + ln(200/155) / ln(1.05)
代入数值计算得:x≈6.206,这就是精确解。
代码实现精确求解
用scipy的数值根求解工具,避免采样点误差:
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import root_scalar # 定义待求解的方程:g(x)-200=0 def equation(x): return 155 * (1.05)**(x-1) - 200 # 在区间[0,25]内求解 result = root_scalar(equation, bracket=[0,25], method='brentq') exact_x = result.root exact_y = 200 # 绘图验证 x = np.linspace(0, 35, 200) g = lambda x: 155 * (1.05)**(x-1) f = lambda x: np.where(x<=25, 200, 0) plt.plot(x, f(x), '-', label='f(x)') plt.plot(x, g(x), '-', label='g(x)') plt.plot(exact_x, exact_y, 'ro', label=f'精确交点 ({exact_x:.4f}, {exact_y})') plt.legend() plt.show() print(f"精确交点x值:{exact_x:.4f},y值:{exact_y}")
采样点方法的局限性
用np.diff(np.sign(...))找交点,本质是找相邻采样点间的符号变化,只能得到近似值,采样数越多精度越高但始终是近似。而且一旦索引使用错误(比如你之前的f(idx)),就会出现完全错误的结果。
内容的提问来源于stack exchange,提问作者jesse
相关产品推荐
相关产品推荐

