Solving an Hamilton Jacobi Bellman equation type /w nonlinear coefficients
42 views (last 30 days)
Show older comments
Hi everyone,
I'm trying to solve numerically a Hamilton-Jacobi-Bellman PDE with nonlinear coefficients. Since I'm pretty new to the PDE toolbox of Matlab, I would like to share my first thoughts and tries so far, just to make sure I'm heading in the right direction.
The equation I'm trying to solve right now is in the form of
a1(x) + a2(t,x,uy) uy + a3(t,x) ux + a4() uxx + ut = 0
with :
- u a function of time t and two space variables x,y
- ux, uy, ut, uxx defined respectively as the first derivative wrt x, the first derivative wrt y, the first derivative wrt t, the second derivative wrt x
- x a space variable between 0.1 and 1 and y a space variable between 0 and 2 (geom will be a simple rectangular geom)
- t a space variable between 0 and 1.
- a1(x) = 1/x
- a2(t,x,uy) = [1-log2(x.uy)]
- a3(t,x) = x.t
- a4() = K1 (cst)
- an initial condition u0(x,y) = K2.y (K cst)
- boundary conditions quite unclear yet: the only thing I know for sure is that u(t,x,0) = 0, I will probably consider simple Neumann boundary conditions for everything else.
Here are a few thoughts I've had, in order to start this. Just let me know if you think I'm not heading in the right direction or missing something.
- Defining a rectangular geom + mesh is a piece of cake.
- Parabolic ( http://www.mathworks.fr/fr/help/pde/ug/parabolic.html ) seems like the function I will need to use to solve this PDE.
- It sounds like I will have to define coefficients c,f,d,a for parabolic in function form, as described here ( http://www.mathworks.fr/fr/help/pde/ug/scalar-coefficients-in-function-form.html )
- The coeffcicients a,d,f are simple to express. However, the way c coefficients (which will be used for a2, a3, a4) are defined in my case is quite unclear to me. I found this ( http://www.mathworks.fr/fr/help/pde/ug/c.html ), but I'm having a really hard time understanding what it really means and what is c is supposed to be (matrix ? with whose coefficients ?). Any simple answer on this would be really helpful.
- I will have to express Dirichlet conditions on the only boundary I know (i.e. u(t,x,0) = 0), Neumann conditions can be added simply in the same custom boundary file, as suggested here ( http://www.mathworks.fr/fr/help/pde/ug/boundary-conditions-for-pde-systems.html )
So far, two questions:
- Am I doing this right ?
- Can anyone provide clarification on point 4 ? (a simple m-file illustrating how it's done or a simple explanation will do perfectly)
Thank you for your time, Best regards,
Matt
0 Comments
Answers (3)
Philip Caplan
on 2 Oct 2014
You have the right idea to use "parabolic" to solve your PDE, however, the terms cannot be manipulated into the format necessary for "parabolic". Considering you have a simple rectangular domain, this problem is well-suited to be solved with a finite difference scheme (as opposed to the finite-element discretization used by "parabolic").
I recommend using MATLAB's "ode45" to integrate in the temporal direction and discretize the differential terms with, say, second-order difference operators. Using the notation in your question, the equation is:
ut = -a1(x) -a2(t,x,uy)uy -a3(t,x)ux -a4()uxx
A simple nx by ny grid for the rectangular domain can be set up with
>> [x,y] = meshgrid(linspace(.1,1,nx),linspace(0,2,ny));
Assuming you have the solution at the previous time step, u, the second derivative (in x) at all interior points can be computed using
>> uxx(2:end-1,:) = ( u(3:end,:) -2*u(2:end-1,:) +u(1:end-2,:) )/dx^2;
where dx is the spacing between grid points in the x-direction (here, 0.9/(nx-1)).
You will need to be careful with points along the boundary and correctly impose boundary conditions, but the idea is the same. With all these difference operators (at all points in the grid), the right-hand side can be provided to "ode45" and you will obtain the time-dependent solution.
Philip Caplan
on 3 Oct 2014
I have attached some sample code which solves the 2D heat equation (with unit diffusivity) using the "ode45" approach. The solution procedure is the same for your case but you will need to treat the boundary conditions appropriately.
Depending on the level of accuracy you seek, there are various ways of implementing the boundary conditions. You might want to try a first-order scheme for your Neumann conditions. In terms of implementation, I recommend updating the boundary points (using the scheme you choose) before computing du/dt for interior points. You would then leave du/dt=0 for the boundary points (but at least these get updated before computing the interior point derivatives). I've put a comment where this should be done.
0 Comments
Bill Greene
on 4 Oct 2014
Hi Matt,
You can, in fact, express your equation in a form that the parabolic function in PDE Toolbox will accept.
The main "trick" is to recognize that the first derivative terms in x and y (ux and uy terms) have to be moved to the right-hand side and included in the parabolic f-coefficient-- i.e. the f-coefficient is a function of ux and uy. The page you reference: http://www.mathworks.fr/fr/help/pde/ug/scalar-coefficients-in-function-form.html shows how to calculate ux and uy (see section "Gradient or Derivatives of u") in the function you write for the f-coefficient.
Regarding your question about the c-coefficient, for your single-equation (single dependent variable) case, the c-coefficient can be thought of as a 2 x 2 matrix, [c11 c12; c21 c22]. The simplest way to see what the entries are for your equation is to expand the term div(c grad(u)) in the scalar parabolic pde. Because you have only a uxx second derivative term, only the c11 term is non-zero. I am unclear on what "K1(cst)" means but, in the most general case, you might want to define a function for the c-coefficient. It would look something like this:
function c = cfunc(p,t,u,time)
number_of_elements = size(t, 2);
cst = ???
% define the diagonal terms of the c-coefficient matrix at
% the centroid of each element (this code assumes the c-coefficient
% doesn't vary as a function of x and y)
c = repmat([K1(cst) 0]', 1, number_of_elements);
end
I should say one more thing about using the parabolic function to solve this equation. If the ux and uy terms are large compared with the uxx term, the parabolic function may run into numerical difficulties obtaining a solution.
Bill
0 Comments
See Also
Categories
Find more on Eigenvalue Problems in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!