Python 3 Ошибки производной аппроксимации с графиком журнала - PullRequest
0 голосов
/ 16 апреля 2020

Мне нужна помощь, чтобы понять это. Я смотрел это видео на YouTube (https://www.youtube.com/watch?v=q5pwy1NZqbM), которое показывает, как построить график ошибок аппроксимации производных на графике журнала. Я получаю то, что показывает окончательный график, но я не уверен, что происходит в сценарии l oop. Вот сценарий полностью:

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()

Для l oop меня действительно смущает. Вот к чему я привык:

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)

Я никогда не видел для l oop, который говорит "для индекса, я в перечислении (x):" Почему это говорит "для индекса" а не "для меня в диапазоне"? Что такое перечислять? И как мне перевести это в a для l oop, с которым я больше знаком?

1 Ответ

0 голосов
/ 18 апреля 2020

Посоветовавшись с моим профессором, я могу ответить на свой вопрос. Оригинал для l oop довольно запутанный для большинства людей, но его можно превратить в al oop, который может узнать большинство людей. Во-первых, чтобы совпасть с графиком журнала, x-пространство делается отрицательным и используется как показатель степени 10. Затем все функции, которые используют это новое пространство, называемое h_vector, индексируются по длине h_vector, а также для л oop. В первой строке для l oop установите переменную 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. В выражении для l oop они выражаются в терминах f, x0 и dx, которые соответствуют f, x и h.

Этот сценарий можно использовать с любым уравнением в x и y. Просто напишите уравнение в функции f (x) и его производную в функции df (x).

...