Аппроксимация производных с использованием Python - PullRequest
0 голосов
/ 29 сентября 2018

Я попытался решить следующую проблему.Сначала я попытался решить проблему с заданным размером шага h, используя 0,1Однако мне нужно изменить это в моем коде и использовать цикл for для циклического перебора значений 0,1, .., 20.Я немного запутался, как решить эту проблему, но я надеялся получить некоторую помощь по исправлению кода, который я создал до сих пор.Спасибо!

enter image description here

import numpy as np
from math import sin

def derivative(func , x, h ):
    for h in range(20):
    return (func(x+h)-func(x))/h

def f(x):
    return sin(x)

print(derivative(f, pi/4))

Дает вывод

0.6706029729039897

МОЯ РЕДАКТИРОВАТЬ:

def derivative(func , x, h ):
    for h in range(20):
    return (func(x+h)-func(x))/h

1 Ответ

0 голосов
/ 29 сентября 2018

В упражнении вас просят вычислить производную, используя переменную точность (представленную с использованием переменной h), и сравнить ее с точной / реальной производной функции.

Пусть h = 10^ -j, где j варьируется от 0 до 20. Это означает, что h будет (дискретно) изменяться от 10⁻⁰ до 10⁻²⁰.Для этого вы можете использовать for -loop и функцию range(...).Затем передайте это в функцию derivative (для которой вы можете использовать третий параметр для значения h)

def derivative(func, x, h):
    return (func(x + h) - func(x)) / h

Далее вам необходимо сравнить это с точным производное.Функция f(x) = sin(x) имеет известную (точную) производную, которая cos(x).В математической записи d(sin x)/dx = cos x.Это означает, что для любого x, cos(x) даст вам точную производную sin при этом x.

Таким образом, вам нужно сравнить результат функции derivative(...) со значением cos(x).Это даст вам разницу.Затем вы можете использовать базовую функцию Python abs(x), чтобы получить абсолютную величину этой разницы, которая даст вам абсолютную разницу, которая является желаемым результатом.Сделайте это для каждого j от 0 до 20 и сохраните результаты где-нибудь, в массиве или в формате.

from math import sin, cos, pi

x = pi / 4
diffs = {}

for j in range(21): # range is exclusive so range(21) will stop at 20
    h = 10 ** -j
    deriv = derivative(sin, x, h)
    exact = cos(x)
    diff = abs(deriv - exact)
    diffs[h] = diff

Затем вы можете использовать функцию loglog pyplot, чтобы отобразить эти результаты на графике., передавая как X результат range(...) и как Y массив, содержащий результаты.

import matplotlib.pyplot as plt

ordered = sorted(diffs.items())
x, y = zip(*ordered)
plt.loglog(x, y)
...