I have the following ODE
$$ u'' = -(1 + e^u), u(0)=0, u(1)=1$$
Using a second order accurate finite difference I obtain
$$ -(1+e^{u_i}) \approx \frac{ u_{i+1} - 2 u_i + u_{i-1} }{h^2} $$
and $u_0 = 0$ and $u_N=1$. Let's say we use mesh size $N$ so we will obtain $N-2$ nonlinear equations for unknowns $u_2,...,u_{N-1}$. Im looking for some help to implement this in Matlab as it would be quite laborious to do it by hand.
After the discretization, you end up with $-(1+e^{u_i}) = \frac{ u_{i+1} - 2 u_i + u_{i-1} }{h^2}$, which is equivalent to find the zeros of the vector valued function $F(u_i)=(1+e^{u_i})+ \frac{ u_{i+1} - 2 u_i + u_{i-1} }{h^2}$ where $2\leq i\leq N-1$
What you are missing is to use a Newton's method in order to solve this system of non-linear equations.
Consider the tridiagonal matrix which arises from the discretization of the second derivative, say it $A$. (But pay attentio at the boundary conditions, you should modify the first and last row)
Then, you can write $\frac{ u_{i+1} - 2 u_i + u_{i-1} }{h^2}$ as a matrix-vector multiplication $A \cdot \vec{u}$.
With this idea in mind, we rewrite the function $F$ by using that matrix:
$F(u)=A\cdot u + \mathbf{1}+e^{\mathbf{u}}$ (note that the RHS is a (N-2)-vector)
Now you just need to use Newton method for the non-linear system, and so you need to compute the Jacobian, which, in this particular case, is
$JF(u)=A+diag(e^u)$
Now just apply Newton's routine and you'll get your numerical solution.
|EDIT|
The following runable Octave code show the correct numerical solution (cfr with the previous question)
|EDIT|$^2$
Note that the following way to impose boundary conditions is in some sense naïf, there are better ways
In order to write a runable MatLab code, I modify just the first and last rows of the function that we have to set to zero.
First of all define the vector of ones $b=\mathcal{1}$, so the system reads:
$Au+b+e^u=0$ (again, with $e^u$ I mean the vector $[e^{u_1},\ldots,e^{u_n}]$
And, I want to have $u_1=0$. To this aim, I impose the first row of the $A$-matrix to have just a $1$ in the (1,1)-position: in this way only $u_1$ survives.
I do this with the command
A(1,1:2)=[1,0]Since I have only a dependence on $u$ on the exponential term, I multiply $u$ by an identity matrix $I$, with $I(1,1)=0$, in order to neglect the term $e^{u_1}$. I do this with the command
I(1,1)=0So far, the first line is $u_1+ b(1) + e^0=0$, or better:
\begin{align} u_1+ b(1) + 1=0 \end{align}
Now, I give the first component of $b$ the value I need in order to have $u_1=0$, which is simply $-1$ ! I do this with the command
b(1)=-1The first line of the system reads now $u_1 +1-1=0$, hence $u_1=0$, as wanted.
The same reasoning applies to the last row, you can see how in the following code.