Fehaid
Fehaid

Reputation: 103

How can I use NxM matrix to be my initial condition in `pdepe`

I solved a PDE using Matlab solver, pdepe. The initial condition is the solution of an ODE, which I solved in a different m.file. Now, I have the ODE solution in a matrix form of size NxM. How I can use that to be my IC in pdepe? Is that even possible? When I use for loop, pdepe takes only the last iteration to be the initial condition. Any help is appreciated.

Upvotes: 0

Views: 1120

Answers (3)

Peter
Peter

Reputation: 1

My experience is that the function defining the initial conditions must return a column vector, i.e. Nx1 matrix if you have N equations. Even if your xmesh is an array of M numbers, the matrix corresponding to the initial condition is still Nx1. You can still return a spatially varying initial condition, and my solution was the following. I defined an anonymous function, pdeic, which was passed as an argument to pdepe:

pdeic=@(x) pdeic2(x,p1,p2,p3);

And I also defined pdeic2, which always returns a 3x1 column vector, but depending on x, the value is different:

function u0=pdeic2(x,extrap1,extrap2,extrap3)
if x==extrap3
    u0=[extrap1;0;extrap2];
else
    u0=[extrap1;0;0];
end

So going back to your original question, my guess would be that you have to pass the solution of your ODE to what is named 'pdeic2' in my example, and depending on X, return a column vector.

Upvotes: 0

mahdee
mahdee

Reputation: 11

it is easier for u to use 'method of line' style to define different conditions on each mesh rather than using pdepe

MOL is also more flexible to use in different situation like 3D problem just saying :))

Upvotes: 1

TroyHaskin
TroyHaskin

Reputation: 8401

Per the pdepe documentation, the initial condition function for the solver has the syntax:

u = icFun(x);

where the initial value of the PDE at a specified value of x is returned in the column vector u. So the only time an initial condition will be a N x M matrix is when the PDE is a system of N unknowns with M spatial mesh points.

Therefore, an N x M matrix could be used to populate the initial condition, but there would need to be some mapping that associates a given column with a specific value of x. For instance, in the main function that calls pdepe, there could be

% icData is the NxM matrix of data
% xMesh is an 1xM row vector that has the spatial value for each column of icData
icFun = @(x) icData(:,x==xMesh);

The only shortcoming of this approach is that the mesh of the initial condition, and therefore the pdepe solution, is constrained by the initial data. This can be overcome by using an interpolation scheme like:

% icData is the NxM matrix of data
% xMesh is an 1xM row vector that has the spatial value for each column of icData
icFun = @(x) interp1(xMesh,icData',x,'pchip')';

where the transposes are present to conform to the interpretation of the data by interp1.

Upvotes: 1

Related Questions