python-3.x - Python 3 导数逼近错误与 loglog 图
问题描述
我需要一些帮助来理解这一点。我观看了这个 YouTube 视频(https://www.youtube.com/watch?v=q5pwy1NZqbM),它展示了如何在对数图上绘制导数近似误差。我得到了最终图表显示的内容,但我不确定脚本的 for 循环中发生了什么。这是完整的脚本:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return np.exp(-x**2)
def f_diff(x):
return -2*x*np.exp(-x**2)
def center(x,h):
return(f(x+h)-f(x-h))/(2*h)
def forward(x,h):
return (f(x+h)-f(x))/h
def backward(x,h):
return (f(x)-f(x-h))/h
def third_approx(x,h):
return (2*f(x+h)+3*f(x)-6*f(x-h)+f(x-2*h))/(6*h)
x0 = 0.2
h_vector = [10**(-temp) for temp in np.arange(0,17,0.1)]
forward_result = np.zeros(len(h_vector))
center_result = np.zeros(len(h_vector))
backward_result = np.zeros(len(h_vector))
third_approx_result = np.zeros(len(h_vector))
true_result = np.zeros(len(h_vector))
for index, i in enumerate(h_vector):
forward_result[index] = forward(x0,i)
center_result[index] = center(x0,i)
backward_result[index] = backward(x0,i)
third_approx_result[index] = third_approx(x0,i)
true_result[index] = f_diff(x0)
plt.figure()
plt.loglog(h_vector, abs(forward_result-true_result),label ='Forward')
plt.loglog(h_vector, abs(center_result-true_result),label='Center')
plt.loglog(h_vector, abs(backward_result-true_result),label='Backward')
plt.loglog(h_vector, abs(third_approx_result-true_result),label='third_approx')
plt.grid()
plt.xlabel('h')
plt.ylabel('Absolute difference')
plt.legend()
plt.show()
for 循环真的让我很困惑。这是我习惯的:
x = np.arange(0,10,0.1) #could also use np.linspace
n = x.size
dx = 0.1
FD = np.zeros(n)
BD = np.zeros(n)
CD = np.zeros(n)
third = np.zeros(n)
exact = np.zeros(n)
for i in range(n):
FD[i] = forward(x[i],dx)
BD[i] = backward(x[i],dx)
CD[i] = center(x[i],dx)
third[i] = third_approx(x[i],dx)
exact[i] = df(dx)
我从未见过一个 for 循环说“for index, i in enumerate(x):” 为什么它说“for index”而不是“for i in range”?什么是枚举?以及如何将其转换为我更熟悉的 for 循环?
解决方案
在咨询了我的教授之后,我可以回答我自己的问题。最初的 for 循环对大多数人来说是相当混乱的,但它可以做成一个大多数人都能识别的循环。首先,为了与 loglog 图一致,x 空间为负数并用作 10 的指数。然后,所有使用这个新空间的函数,称为 h_vector,都被索引到 h_vector 的长度,以及for 循环。在 for 循环的第一行,设置一个变量 dx 等于索引的 h_vector。这是此问题的完整脚本:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return np.exp(-x**2)
def df(x):
return -2*x*np.exp(-x**2)
def center(f,x,h):
return(f(x+h)-f(x-h))/(2*h)
def forward(f,x,h):
return (f(x+h)-f(x))/h
def backward(f,x,h):
return (f(x)-f(x-h))/h
def third_approx(f,x,h):
return (2*f(x+h)+3*f(x)-6*f(x-h)+f(x-2*h))/(6*h)
x = np.linspace(0,3,100)
x0 = 0.2
h_vector = [10**(-temp) for temp in np.arange(0,17,0.1)]
nh = len(h_vector)
FD = np.zeros(nh)
BD = np.zeros(nh)
CD = np.zeros(nh)
third = np.zeros(nh)
exact = np.zeros(nh)
for i in range(nh):
dx = h_vector[i]
FD[i] = forward(f,x0,dx)
BD[i] = backward(f,x0,dx)
CD[i] = center(f,x0,dx)
third[i] = third_approx(f,x0,dx)
exact[i] = df(x0)
plt.figure()
plt.title('e^(-x^2) and Derivative')
plt.plot(x,f(x),label='e^(-x^2)')
plt.plot(x,df(x),label='df/dx(e^(-x^2))')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.show()
plt.figure()
plt.title('Difference between Derivative Approximations and Exact Value')
plt.loglog(h_vector,abs(FD-exact),label='Forward difference')
plt.loglog(h_vector,abs(BD-exact),label='Backward difference')
plt.loglog(h_vector,abs(CD-exact),label='Center difference')
plt.loglog(h_vector,abs(third-exact),label='Exact value')
plt.legend()
plt.xlabel('10^(-x)')
plt.ylabel('10^(-y)')
plt.grid()
plt.show()
请注意此脚本与上述原始脚本之间的差异。导数近似是根据三个变量:f、x 和 h。在 for 循环中,它们以 f、x0 和 dx 表示,分别对应于 f、x 和 h。
此脚本可用于 x 和 y 中的任何方程。只需将方程写在 f(x) 函数中,并将其导数写在 df(x) 函数中。
推荐阅读
- javascript - 需要从数据库事务返回数据反应本机
- ios - 从活动视图控制器中删除“添加标签” - 分享
- sql - 选择所有不连续出现在 SQL 中的人
- javascript - 如何使 ajax 同步而不是使用 async:false?
- java - 我需要构建单独的 java 项目并与 moqui 集成作为中间
- java - 如何使用 Java 8 转换这段代码?
- variables - 如何在 kotlin 中修改其范围之外的变量?
- javascript - Chart.js,返回一个“日期”数组来绘制折线图
- c - 有没有办法让字符串独立于其他人?
- cmd - 如何在 Windows 命令提示符下运行 jdbc sink 连接器?windows cmd 中 curl 命令的替代方法