bvpsolve finds an approximate solution of a boundary value problem
y″=f(x,y,y′), y(a)=α, y(b)=β |
on the interval [a,b]. It takes the following mandatory arguments :
One or more of the additional arguments below can optionally follow (in no particular order) :
The procedure uses the method of nonlinear shooting which is based on Newton and Runge-Kutta methods. Values of y and its first derivative y′ are approximated at points x_{k}=a+k δ, where δ=b−a/N and k=0,1,…,N. For the numeric tolerance (precision) threshold, the algorithm uses epsilon specified in the session settings in Xcas. If the output type is
Note that the shooting method is sensitive to roundoff errors and may fail to converge in some cases, especially when y is a rapidly increasing function. In the absence of convergence or if the maximum number of iterations is exceeded, bvpsolve returns undef. However, if output type is list or piecewise and if N>2, a slower but more stable finite-difference method (which approximates only the function y) is tried first.
Sometimes setting an initial guess for y′(a) to a suitable value may help the shooting algorithm to converge or to converge faster. The default initial guess y_{0}′ for the value y′(a) is
y_{0}′= |
| . |
In the first example we solve the problem
y″= |
| (32+2 x^{3}−y y′), 1≤ x≤ 3 |
with boundary conditions y(1)=17 and y(3)=43/3. We use N=20, which gives x-step of 0.01. Input :
^
3-y*y’)/8,[x=1..3,y],[17,43/3],20)
The output is shown in Table 8.1 (the middle two columns) alongside with the values y(x_{k}) of the exact solution y=x^{2}+16/x (the fourth column).
k x_{k} y_{k} y(x_{k}) 0 1.0 17.0 17.0 1 1.1 15.7554961579 15.7554545455 2 1.2 14.7733911821 14.7733333333 3 1.3 13.9977543159 13.9976923077 4 1.4 13.388631813 13.3885714286 5 1.5 12.9167227424 12.9166666667 6 1.6 12.5600506483 12.56 7 1.7 12.3018096101 12.3017647059 8 1.8 12.1289281414 12.1288888889 9 1.9 12.0310865274 12.0310526316 10 2.0 12.0000289268 12.0 11 2.1 12.0290719981 12.029047619 12 2.2 12.1127475278 12.1127272727 13 2.3 12.2465382803 12.2465217391 14 2.4 12.4266798825 12.4266666667 15 2.5 12.650010254 12.65 16 2.6 12.9138537834 12.9138461538 17 2.7 13.2159312426 13.2159259259 18 2.8 13.5542890043 13.5542857143 19 2.9 13.9272429048 13.9272413793 20 3.0 14.3333333333 14.3333333333
In the next example we solve the problem
y″= |
| , 1≤ x≤ 2, |
with the boundary conditions y(1)=0 and y(2)=ln256. We obtain the solution as a piecewise spline interpolation for N=10 and estimate the absolute error err of the approximation using the exact solution y=x^{3} lnx and romberg command for numerical integration. We also need to explicitly set an initial guess y_{0}′ for the value y′(1) because the algorithm fails to converge with the default guess y_{0}′=ln256≈ 5.545. Therefore let y_{0}′=1 instead. Input :
^
2*diff(y(x),x)^
2-9*y(x)^
2+4*x^
6)/x^
5:; vars:=[x=1..2,y]:; yinit:=[0,ln(256),1]:; p:=bvpsolve(f,vars,yinit,10,output=spline):; err:=sqrt(romberg((p-x^
3*ln(x))^
2,x=1..2))
Output :
Note that, if the output type was set to list or piecewise, the solution would have been found even without specifying an initial guess for y′(1) because the algorithm would automatically apply the alternative finite-difference method, which converges.