#python #numpy #math #python-requests
Вопрос:
Я использую python для вычисления прямых, центральных и обратных конечных разностей f(x)=cos(x). Я могу заставить их строить график, когда выполняется каждая итерация с заданным размером шага (h). Однако моя главная задача состоит в том, чтобы уменьшить размер шага в два раза для каждой итерации методов конечных разностей. Вот цикл, который я пытался сделать, но это не сработало.
h = 5
while h > 0.0005:
h = h / 2
И это мой код, в котором он имеет постоянный размер шага, который я пытаюсь изменить, чтобы он уменьшался в 2 раза для каждой итерации.
import numpy as np
import matplotlib.pyplot as plt
f = lambda x: np.cos(x)
h=5
#Forward Difference
dff1=(f(x h)-f(x))/h
plt.plot(x,dff1,'-b')
#Backward Difference
dff1=(f(x)-f(x-h))/h
plt.plot(x,dff1,'-r')
#Central Difference
dff1=(f(x h)-f(x-h))/(2*h)
plt.plot(x,dff1,'-g')
#plot
plt.xlabel('x')
plt.ylabel('y')
plt.legend(["FFD","BFD","CFD"])
plt.grid()
plt.show()
Я все еще новичок в программировании, поэтому, пожалуйста, не судите меня слишком строго, если это легкая проблема! Я ценю любую помощь или совет, которые могут быть предложены!!! 🙂
Комментарии:
1. Этот цикл явно создаст достаточно небольшое
h
, но только одно значение для использования любым кодом после цикла. Вы хотели добавить что-то еще в цикл, чтобы последовательно использовать каждое уменьшенное значение? (Кроме того, гдеx
определяется?)2. Да, я хочу, чтобы все значения h на одном графике начинались с наибольшего (5) и делились на 2, пока не закончится мое наименьшее значение h (независимо от того, какое число ближе всего к 0,0005). В основном это покажет, как уравнение становится более точным по мере уменьшения h. Как ты думаешь, ты мог бы мне в этом помочь? Надеюсь, я выразился более ясно!
Ответ №1:
Предполагая, что вы нанесли фигуру (использовали h) внутри тела цикла while, то, что вы сказали, должно сработать.
Более подробно:
import numpy as np
import matplotlib.pyplot as plt
f = lambda x: np.cos(x)
x=np.linspace(-np.pi, np.pi, num=50) #x should be initialized. this line was missing.
h=5
while h > 0.0005:
h = h/2. #starts at 5/2 for the first iteration. 5/4 for the second,..etc
#Forward Difference
dff1=(f(x h)-f(x))/h
plt.plot(x,dff1,'-b')
#Backward Difference
dff1=(f(x)-f(x-h))/h
plt.plot(x,dff1,'-r')
#Central Difference
dff1=(f(x h)-f(x-h))/(2*h)
plt.plot(x,dff1,'-g')
#plot
plt.xlabel('x')
plt.ylabel('y')
plt.legend(["FFD","BFD","CFD"])
plt.grid()
plt.show() #the next iteration won't start until you close the window.
Комментарии:
1. Спасибо вам за помощь. Как мне получить его там, где он отобразит все мои значения h на графике.? Прямо сейчас он использует только то, чему я установил значение h равным, когда я внес изменения, которые у вас были.
2. По сути, это произойдет, если вы переместите последнюю строку, отображающую изображение, за пределы цикла while. (Просто снимите его.) Это работает, потому что это делает его циклическим и строит на одной и той же фигуре каждую итерацию, поэтому нам нужно отображать фигуру только после окончания цикла.