siam student workshop on matlab and differential equations

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

Upload: phamdan

Post on 11-Dec-2016

229 views

Category:

Documents


4 download

TRANSCRIPT

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