使用 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
个值.
这里我删除了解析解,因为你没有提供那个函数:
所以我目前正在使用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
个值.
这里我删除了解析解,因为你没有提供那个函数: