Ищу совета по математическому циклу Python

#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. (Просто снимите его.) Это работает, потому что это делает его циклическим и строит на одной и той же фигуре каждую итерацию, поэтому нам нужно отображать фигуру только после окончания цикла.