12-267/Numerical Methods: Difference between revisions
(Created page, based largely off of http://imgur.com/a/uLSlM posted by Simon1) |
(Added python example of Euler's method, headings) |
||
| Line 1: | Line 1: | ||
==Summary of Numerical Methods== |
|||
| ⚫ | |||
Numerical methods: <math>\frac{dy}{dt} = f(t, y)</math> and <math>y(t_0) = y_0</math>, <math>y = \Phi(t)</math> is a solution. |
Numerical methods: <math>\frac{dy}{dt} = f(t, y)</math> and <math>y(t_0) = y_0</math>, <math>y = \Phi(t)</math> is a solution. |
||
| Line 46: | Line 51: | ||
Global truncation error is proportional to <math>h^4</math>. |
Global truncation error is proportional to <math>h^4</math>. |
||
==Python Example of Euler's Method== |
|||
In class on October 15th we discussed Euler's Method to numerically compute a solution to a differential equation. <math>x_0</math> and <math>y_0</math> are given as well as an increment amount <math>h</math>, <math>x_{n+1} = x_n + h</math>, and we use the guess <math>y_{n+1} = y_n + f(x_n, y_n)*h</math> where f computes the derivative as a function of x and y. |
|||
Here is an example of code (written in Python) which carries out Euler's Method for the example we discussed in class, <math>y' = -y</math>: |
|||
def f(x, y): |
|||
| ⚫ | |||
return -y |
|||
def euler(x, y, f, h, x_max): |
|||
"""Take in coordinates x and y, a function f(x, y) which calculates |
|||
dy/dx at (x, y), an increment h, and a maximum value of x. |
|||
Return a list containing coordinates in the Euler's Method computation |
|||
of the solution to Phi' = f(x, Phi(x)), Phi(x) = y, with the x |
|||
values of those coordinates separated by h, and not exceeding x_max. |
|||
""" |
|||
if x > x_max: # we have already calculated all our values |
|||
return [] |
|||
x_next, y_next = (x + h, y + f(x, y)*h) # calculate the next x, y values |
|||
# return the current coordinates, and every coordinates following it, in a list |
|||
return [(x_next, y_next)] + euler(x_next, y_next, f, h, x_max) |
|||
if __name__ == '__main__': |
|||
print euler(0, 1, f, 0.01, 1)[-1] |
|||
Revision as of 19:59, 25 October 2012
Summary of Numerical Methods
Based largely off of a note available here Simon1 --Twine 20:55, 25 October 2012 (EDT)
Numerical methods: [math]\displaystyle{ \frac{dy}{dt} = f(t, y) }[/math] and [math]\displaystyle{ y(t_0) = y_0 }[/math], [math]\displaystyle{ y = \Phi(t) }[/math] is a solution.
1. Using the proof of Picard's Theorem:
[math]\displaystyle{ \Phi_0(x) = y_0 }[/math]
[math]\displaystyle{ \Phi_n(x) = y_0 + \int_{x_0}^x f(x, \Phi_{n-1}(x)) dx }[/math]
[math]\displaystyle{ \Phi_n(x) \rightarrow \Phi(x) }[/math]
2. The Euler Method:
[math]\displaystyle{ y_{n+1} = y_n + f(t_n, y_n)(t_{n+1} - t_n) = y_n + f_n h }[/math] if h is constant
Backward Euler formula: [math]\displaystyle{ y_{n+1} = y_n + h f(t_{n+1}, y_{n+1}) }[/math]
Local truncation error: [math]\displaystyle{ e_{n+1} = \frac{1}{2} \Phi''(t_n)h^2 \leq \frac{Mh^2}{2} }[/math] where [math]\displaystyle{ m = \mathrm{max} |\Phi''(t)| }[/math]
Local error is proportional to [math]\displaystyle{ h^2 }[/math].
Global error is proportional to h.
3. Improved Euler Formula (or Heun Formula):
[math]\displaystyle{ y_{n+1} = y_n + \frac{f_n + f(t_n + h, y_n + hf_n)}{2} h }[/math]
Local truncation error is proportional to [math]\displaystyle{ h^3 }[/math]
Global truncation error is proportional to [math]\displaystyle{ h^2 }[/math]
4. The Runge-Kutta Method:
[math]\displaystyle{ y_{n+1} = y_n + \frac{k_{n1} + 2k_{n2} + 2k_{n3} + k_{n4}}{6} h }[/math]
where
[math]\displaystyle{ k_{n1} = f(t_n, y_n) \quad k_{n2} = f(t_n + \frac{1}{2} h, y_n + \frac{1}{2}hk_{n1}) }[/math]
[math]\displaystyle{ k_{n3} = f(t_n + \frac{1}{2} h, y_n + \frac{1}{2}hk_{n2}) \quad k_{n4} = f(t_n + h, y_n + hk_{n3}) }[/math]
Local truncation error is proportional to [math]\displaystyle{ h^5 }[/math].
Global truncation error is proportional to [math]\displaystyle{ h^4 }[/math].
Python Example of Euler's Method
In class on October 15th we discussed Euler's Method to numerically compute a solution to a differential equation. [math]\displaystyle{ x_0 }[/math] and [math]\displaystyle{ y_0 }[/math] are given as well as an increment amount [math]\displaystyle{ h }[/math], [math]\displaystyle{ x_{n+1} = x_n + h }[/math], and we use the guess [math]\displaystyle{ y_{n+1} = y_n + f(x_n, y_n)*h }[/math] where f computes the derivative as a function of x and y.
Here is an example of code (written in Python) which carries out Euler's Method for the example we discussed in class, [math]\displaystyle{ y' = -y }[/math]:
def f(x, y):
return -y
def euler(x, y, f, h, x_max):
"""Take in coordinates x and y, a function f(x, y) which calculates
dy/dx at (x, y), an increment h, and a maximum value of x.
Return a list containing coordinates in the Euler's Method computation
of the solution to Phi' = f(x, Phi(x)), Phi(x) = y, with the x
values of those coordinates separated by h, and not exceeding x_max.
"""
if x > x_max: # we have already calculated all our values
return []
x_next, y_next = (x + h, y + f(x, y)*h) # calculate the next x, y values
# return the current coordinates, and every coordinates following it, in a list
return [(x_next, y_next)] + euler(x_next, y_next, f, h, x_max)
if __name__ == '__main__':
print euler(0, 1, f, 0.01, 1)[-1]