使用 numpy 和 matplotlib 时绘图不是从 0 开始

Plot not starting from 0 while using numpy and matplotlib

所以我目前正在使用numpy和matplotlib做一个数学作业,是关于数值微分法的。所以首先我定义了一个数学函数如下:

def f_x(x):
y = -(3.71*x**2.3)
return y.real

然后我输入数值微分的代码:

def cal_derivative(a_function, x, delta_x, method): 
if method == "forward":
    delta_y = a_function(x + delta_x) - a_function(x)
    derivative = delta_y/(delta_x)
if method == "backward":
    delta_y = a_function(x).real - a_function(x - delta_x).real
    derivative = delta_y/(delta_x)
if method == "central":
    delta_y = a_function(x + delta_x).real - a_function(x - delta_x).real
    derivative = delta_y/(2*delta_x)
return derivative.real

最后我绘制了数值导数的 grpah:

import numpy as np
import matplotlib.pyplot as plt
x_increment = 1
x_range = np.arange(0, 8+x_increment, x_increment)
y_1 = cal_derivative(f_x, x_range , 1, "forward")
y_2 = cal_derivative(f_x, x_range , 1, "backward")
y_3 = cal_derivative(f_x, x_range , 1, "central")
y_4 = analytical_derivative(x_range)
plt.plot(x_range,y_1,label = "Result for forward difference method")
plt.plot(x_range,y_2,label = "Result for backward backward method")
plt.plot(x_range,y_3,label = "Result for central divided difference method")
plt.plot(x_range,y_4,label = "Analytical differentiation result")
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.title("Result comparsion for x∈[0,8], Δx=1.0")
plt.ylabel("y")
plt.xlabel("x")

然后,我期待我的数值微分代码的输出在图表上从 x=0 到 x=8 绘制。然而,我得到了这样的东西:

在我得到的图中,向后和中心差分法的导数并没有像我预期的那样从0开始。我怀疑这是因为对于 x<1 和 delta_x = 1,我的代码涉及一个负数的小数次幂(在这种情况下为 2.3),因此导致了这个错误,但我不是当然。我多次尝试解决这个问题,但没有成功。有人可以帮我解决这个问题吗?任何帮助,将不胜感激。非常感谢。

您可能需要将 x_range 设置为复杂类型,如下所示:

x_range = np.arange(0, 8+x_increment, x_increment) + 0j

这样做,Numpy 将能够评估 f_x 计算复杂的值。如果您要在 x_range 中使用 dtype=float(就像您现在所做的那样),那么当 x 为负时,f_x 的计算将创建 Nan 个值.

这里我删除了解析解,因为你没有提供那个函数: