SIAM student workshop on Matlab and differential equations

37
SIAM student workshop on Matlab and differential equations Mike Sussman December 1, 2012

Transcript of SIAM student workshop on Matlab and differential equations

Page 1: SIAM student workshop on Matlab and differential equations

SIAM student workshop on Matlab and differential equations

Mike Sussman

December 1, 2012

Page 2: SIAM student workshop on Matlab and differential equations

Outline

Introduction

Ordinary Differential Equations (ODEs)Options for controlling ode solvers

Partial Differential Equations (PDEs)Heat equationBurgers’ equation

Page 3: SIAM student workshop on Matlab and differential equations

Who am I?

I Mike SussmanI email: [email protected]

There is an “m” at the end of “sussman”.I Thackeray 622I Web page: http://www.math.pitt.edu/˜sussmanmI Retired from Bettis Laboratory in West Mifflin.I Part-time instructor at Pitt: 2070, 2071, 3040I Interests: numerical partial differential equations, particularly the

Navier-Stokes equations and applications

Page 4: SIAM student workshop on Matlab and differential equations

Objectives

I Matlab Ordinary Differential Equation (ODE) solvers and applicationI Solving ODEs with default optionsI Writing m-files to define the systemI Advanced options

I Solving time-dependent Partial Differential Equations (PDEs) usingMatlab ODE solvers.

I Finite-difference discretizationsI One and two space dimension, one time dimension

Page 5: SIAM student workshop on Matlab and differential equations

Non-objective

I Will not discuss the Matlab PDE toolboxI GUI for creating complicated 2D meshI Limited set of differential equations, not including Navier-Stokes.I Limited choice of finite element.

Page 6: SIAM student workshop on Matlab and differential equations

Start up Matlab

I Log inI Start up Matlab

Page 7: SIAM student workshop on Matlab and differential equations

Outline

Introduction

Ordinary Differential Equations (ODEs)Options for controlling ode solvers

Partial Differential Equations (PDEs)Heat equationBurgers’ equation

Page 8: SIAM student workshop on Matlab and differential equations

Initial Value Problem (IVP)

u = f (t , u)

u(t0) = u0.

I u ∈ Rn

I u is shorthand for the derivative du/dtI Explicit because u can be written explicitly as a function of t and uI First-order because the highest derivative that appears is the first

derivative uI Higher-order equations can be written as first-order systemsI IVP because u0 is given and solution is u(t) for t > t0

Page 9: SIAM student workshop on Matlab and differential equations

Boundary Value Problems (BVP)

I Values specified at both initial and final timesI No special support for BVP in MatlabI Can use shooting methodsI Can use finite element or finite difference methods

Page 10: SIAM student workshop on Matlab and differential equations

Solutions

I An analytic solution is a formula u(t) ∈ Cp for some pI A numerical solution of an ODE is a table of times and approximate

values (tk , uk ), possibly with an interpolation ruleI In general, a numerical solution is always wrong, and numerical analysis

focusses on the error.

Page 11: SIAM student workshop on Matlab and differential equations

Steps for basic solution

u = f (t , u)

u(t0) = u0.

1. Write a Matlab m-file to define the function f .

2. Choose a Matlab ODE solver

Page 12: SIAM student workshop on Matlab and differential equations

Matlab ODE solvers

Matlab ODE solvers and supportode23 non-stiff, low orderode113 non-stiff, variable orderode15s stiff, variable order, includes DAEode23s stiff, low orderode23t trapezoid ruleode23tb stiff, low orderode45 non-stiff, medium order (Runge-Kutta)odeset sets options for all ODE solversodeget gets current options

Page 13: SIAM student workshop on Matlab and differential equations

What is a DAE?

G(t , u,dudt

) = 0

orM

dudt

= f (t , u)

where M is not an invertible matrix or where G cannot be solved for du/dt .

Page 14: SIAM student workshop on Matlab and differential equations

Learning strategy

1. Do simple and “known good” examples

2. Pick a simple example simlar to the objective but that has a known,steady solution. Be sure the steady solution holds for both very shortand long times. Check that f (t , u) = 0.

3. If there is a known unsteady solution, test it.

4. If there is no known unsteady solution, change conditions and see if thesolution is well-behaved. Check that all known theoretical conditions arereflected in the solution.

5. Go on to progressively harder and more realistic examples.

Page 15: SIAM student workshop on Matlab and differential equations

Debugging strategy

What if my steady example won’t work?

I Choose a ridiculously short time and see if it works.I Try one Euler explicit time step with a very small ∆t

un+1 = un + ∆t f (tn, un)

If this doesn’t work, f (t , u) 6= 0.I Try several Euler explicit steps.I If Euler explicit works but Matlab does not, you are probably using

Matlab wrong. Check everything.I Warning: Matlab will call your f (t , u) many times in order to compute an

approximate Jacobian matrix. If that matrix is not a good approximation,the Matlab solvers will not work.

Page 16: SIAM student workshop on Matlab and differential equations

A first example

dudt

= sin t − u

u(0) =1

The Matlab m-file is ex1_ode.m.

function udot=ex1_ode(t,u)% udot=ex1_ode(t,u)% computes the right side of the ODE du/dt=sin(t)-u% t,u are scalars% udot is value of du/dt

udot=sin(t)-u;

Use this command line:

ode45(@ex1_ode,[0,15],1)

Page 17: SIAM student workshop on Matlab and differential equations

More first example

If you want to get access to the solution values, use the following commandline

[t,u]=ode45(@ex1_ode,[0,15],1);

You can then plot it using the normal plot commands

plot(t,u)

or compare it with other solutions

plot(t,u,t,sin(t))

Page 18: SIAM student workshop on Matlab and differential equations

A stiff example

I Widely-different time scalesI Modify example 1 to be u = 1000 ∗ (sin(t)− u)

I Changing name of function requires changing name of file!I ex2_ode.m

I Looks like sin t .

[t,u]=ode45(@ex2_ode,[0,15],1);plot(t,u,t,sin(t))

I But different for first 100 time steps!

plot(t(1:100),u(1:100),t(1:100),sin(t(1:100)))

Page 19: SIAM student workshop on Matlab and differential equations

How to tell stiffness

I Easiest way is to time a non-stiff solver and a stiff solver

tic;[t45,u45]=ode45(@ex2_ode,[0,15],1);toc[t15s,u15s]=ode15s(@ex2_ode,[0,15],1);tic;[t15s,u15s]=ode15s(@ex2_ode,[0,15],1);toc

Never time the first use of a function!I Solution is same.

plot(t45,u45,t15s,u15s)

I Time difference comes from number of steps

length(u45)length(u15s)

I Visual depiction of number of steps

plot(t45,u45,’b*’,t15s,u15s,’y*’)

Page 20: SIAM student workshop on Matlab and differential equations

High order ODEs as systems

Consider a fourth-order differential equation

5d4udt4 + 4

d3udt3 + 3

d2udt2 + 2

dudt

+ u = sin(t)

The first step is to define new variables

v1 = u

v2 = du/dt

v3 = d2u/dt2

v4 = d3u/dt3

and write

v1 = v2

v2 = v3

v3 = v4

v4 = (sin x − v1 − 2v2 − 3v3 − 4v4)/5

Page 21: SIAM student workshop on Matlab and differential equations

van der Pol’s equation

u + a(u2 − 1)u + u = 0

I Assume a > 0. We will use a = 3.I u < 1, system behaves as negatively-damped oscillatorI u > 1, system behaves as damped oscillatorI tunnel diodes, beating heart

Page 22: SIAM student workshop on Matlab and differential equations

van der Pol solution

I ex3_ode.m

function udot=ex3_ode(t,u)% udot=ex3_ode(t,u)% van der Pol ode with A=1

A=3;% udot MUST be a column vectorudot=[ u(2)

-A*(u(1)^2-1)*u(2)-u(1)];

I There are other ways to make column vectors.I Not stiff. Use ode45

[t u]=ode45(@ex3_ode,[0,75],[1;0]);

I First component of solution is u, second is u

plot(t,u(:,1))

Page 23: SIAM student workshop on Matlab and differential equations

Options: odeset

Some options for odesetOption name value defaultAbsTol positive scalar or vector 1e-6RelTol positive scalar 1e-3OutputFcn function_handleOutputSel vector of integersStats on | off offInitialStep positive scalarMaxStep positive scalarMaxOrder 1 | 2 | 3 | 4 | 5 5Jacobian matrix | function_handleJPattern sparse matrixVectorized on | off offMass matrix | function_handleMvPattern sparse matrixMassSingular yes | no | maybe maybeInitialSlope vectorEvents function_handle

Page 24: SIAM student workshop on Matlab and differential equations

Using options

I Use all default options:

ode45(@ex3_ode,[0,15],[1;0]);

I Change one option:

opt=odeset(’OutputSel’,1);ode45(@ex3_ode,[0,15],[1;0],opt);

I Change several options:

opt=odeset(’OutputSel’,1,’RelTol’,1.e-5);ode45(@ex3_ode,[0,15],[1;0],opt);

I Alternative

opt=odeset(’OutputSel’,1);opt=odeset(opt,’RelTol’,1.e-5);

Page 25: SIAM student workshop on Matlab and differential equations

A word about tolerance

I RelTol and AbsTol:

ei ≤ max{(RelTol)|yi |, (AbsTol)i}

I If NormControl is on, then tolerance is done using norms, notcomponentwise.

Page 26: SIAM student workshop on Matlab and differential equations

Some other options

I Vectorized if ODE function is coded so that F(t,[y1 y2 ...])returns [F(t,y1) F(t,y2) ...]

I Events is discussed belowI Refine to interpolate between pointsI Stats for printed statisticsI Jacobian is critical when extremely stiff

Page 27: SIAM student workshop on Matlab and differential equations

Extra parameters

I ex4_ode.m

function udot=ex4_ode(t,u,a)% udot=ex4_ode(t,u,a)% van der Pol ode with parameter = a% default value of a is 1

if nargin < 3a=3;

end

udot=[ u(2)-a*(u(1)^2-1)*u(2)-u(1)];

I Timing test ...

tic;[t,u]=ode45 (@ex4_ode,[0,750],[1;0],[], 3);toctic;[t,u]=ode15s(@ex4_ode,[0,750],[1;0],[], 3);toctic;[t,u]=ode45 (@ex4_ode,[0,750],[1;0],[],50);toctic;[t,u]=ode15s(@ex4_ode,[0,750],[1;0],[],50);toc

Page 28: SIAM student workshop on Matlab and differential equations

Accuracy

Solutions must be critically evaluated!In this case, default options are too coarse to pick up the nonzero initial value!

opt=odeset(’AbsTol’,1.e-14,’RelTol’,1.e-10);[td,ud]=ode15s(@ex4_ode,[0,200],[1.e-5;0],[] ,100);[to,uo]=ode15s(@ex4_ode,[0,200],[1.e-5;0],opt,100);plot(td,ud(:,1),to,uo(:,1))

Page 29: SIAM student workshop on Matlab and differential equations

Critical events

I ex4_event.m (look for peak)

function [value,isterminal,direction]=ex4_event(t,u,dummy)% [value,isterminal,direction]=ex4_event(t,u,dummy)

% event is when value becomes zero

value= u(2) ; % event is when derivative becomes 0direction=-1; % event is when derivative is decreasingisterminal=1; % terminate at event

I Use any of the integrators with it

opt=odeset(’OutputSel’,1,’Events’,@ex4_event);ode45(@ex4_ode,[0,25],[2.5;0],opt);

I To pick up and continue for one more cycle:

[t0,u0]=ode45(@ex4_ode,[0,25],[2.5;0],opt);[t1,u1]=ode45(@ex4_ode,[t0(end),25],u0(end,:),opt);plot(t0,u0(:,1),’b’,t1,u1(:,1),’r’);

Page 30: SIAM student workshop on Matlab and differential equations

Outline

Introduction

Ordinary Differential Equations (ODEs)Options for controlling ode solvers

Partial Differential Equations (PDEs)Heat equationBurgers’ equation

Page 31: SIAM student workshop on Matlab and differential equations

Heat equation: continuous

I Imagine a rod of some sort of metal,I Part of it might be heated in some mannerI Its ends are kept at a constant temperatureI It starts out with some distribution of temperature

I Temperature is u(x , t), xleft ≤ x ≤ xright, and t ≥ tinitial.

∂u∂t

=∂

∂x

(k(u, x , t)

∂u∂x

)+ f (x , t)

I Boundary condtions u(xleft, t) = uleft(t), u(xright, t) = uright(t).I Initial condition u(x , tinitial) = uinitial(x).

Page 32: SIAM student workshop on Matlab and differential equations

Spatial discretization

q q qb r r r r r r bx0 = 0 x1 x2 x3 xN−1 xN = 1

∆xu0 = 0 u1 u2 u3 uN−1 uN = 0

I xleft = 0, xright = 1, tinitial = 0, k(x , t) = 2x + t + 1I uleft = uright = 0I Choose N, and set ∆x = 1/NI xn = n∆x for n = 0, 1, . . . ,NI un(t) ≈ u(xn, t).

I un =[k(xn+1/2, t)

(un+1−un

∆x

)− k(xn−1/2, t)

(un−un−1

∆x

)]/∆x

Page 33: SIAM student workshop on Matlab and differential equations

Matlab spatial discretization

un =[k(xn+1/2, t)

(un+1−un

∆x

)− k(xn−1/2, t)

(un−un−1

∆x

)]/∆x

dx=1/N;for n=1:N-1

kright=(2*(x(n)+dx/2)+t+1);kleft =(2*(x(n)-dx/2)+t+1);if n==1 %leftudot(n,1)=(kright*(u(n+1)-u(n))-kleft*(u(n)-uleft ))/dx^2;

elseif n<N-1 %interiorudot(n,1)=(kright*(u(n+1)-u(n))-kleft*(u(n)-u(n-1)))/dx^2;

elseif n==N %rightudot(n,1)=(kright*(uright-u(n))-kleft*(u(n)-u(n-1)))/dx^2;

else %impossibleerror(’Error in ex5_ode: bad value of n’)

endend

Full code is in ex5_ode.m

Page 34: SIAM student workshop on Matlab and differential equations

Heat equation results

[t,u]=ode15s(@ex5_ode,[0,.1,.2,.3,.4,.5],100*ones(99,1));figure(1)for k=1:6

plot(u(k,:))hold on

endhold offtitle(’Temperature distribution at several times’)figure(2)plot(u(:,50))xlabel(’time’)ylabel(’temperature’)title(’Temperature vs. time in the middle’)

Page 35: SIAM student workshop on Matlab and differential equations

Burgers’ equation

∂u∂t

+ u∂u∂x

= ν∂2u∂x2

With uleft = 1 and ∂u∂x

∣∣right = 0 and u ∈ [0, 1].

dun

dt= ν

un+1 − 2un + un−1

δx2 − unun+1 − un−1

2∆x

With uleft = 1 and ∂u∂x

∣∣right = 0 approximated by uright+ = uN .

Page 36: SIAM student workshop on Matlab and differential equations

ex6_ode.m

Note: Now there is an xN because of the new boundary condition.

dx=1/N;x=(1:N)*dx;for n=1:N

if n==1 %leftudot(n,1)=nu*(u(n+1)-2*u(n)+uleft )/dx^2- ...u(n)*(u(n+1)-uleft )/(2*dx);

elseif n<N %interiorudot(n,1)=nu*(u(n+1)-2*u(n)+u(n-1))/dx^2- ...u(n)*(u(n+1)-u(n-1))/(2*dx);

else n==N %right% approximate Neumann b.c.uright=u(n);udot(n,1)=nu*(uright-2*u(n)+u(n-1))/dx^2- ...u(n)*(uright-u(n-1))/(2*dx);

else %impossibleerror(’Error in ex6_ode: bad value of n’)

endend

Page 37: SIAM student workshop on Matlab and differential equations

Running ex6

I ν = .001 solution is relatively smooth.

N=500;init=(1-linspace(0,1,N)).^3;nu=.001;[t,u]=ode45(@ex6_ode,0:.01:1.5,init,[],nu);

I See the wave steepen as it moves

for k=1:length(u(:,1));plot(u(k,:));axis([0,N,0,2]);pause(.1);end

I ν = .0001 causes numerics to break down: need much finer mesh

nu=.0001;[t,u]=ode45(@ex6_ode,0:.01:1.5,init,[],nu);

I See the oscillations grow

for k=1:length(u(:,1));plot(u(k,:));axis([0,N,0,2]);pause(.1);end