function fx = p18_fun ( option, nvar, u ) %*****************************************************************************80 % %% P18_FUN evaluates the function for problem 18. % % Title: % % The Semiconductor Problem. % % Description: % % The continuous problem is a two point boundary value problem % of the form % % - U'' = G ( T, U, LAMBDA ) % % for A < T < B, with boundary conditions % % U(A) = LAMBDA * UA, % U(B) = LAMBDA * UB. % % and with right hand side: % % G ( T, U, LAMBDA ) = LAMBDA * % ( CA * EXP ( LAMBDA * BETA * ( LAMBDA * UA - U ) ) % - CB * EXP ( LAMBDA * BETA * ( U - LAMBDA * UB ) ) + H(T) ) % % and % % H(T) = - CA for T <= 0, % = CB for 0 < T. % % The discrete version of the problem uses a mesh of M points % T(1) = A, T(2) = A + H, T(3) = A * 2 * H, ..., T(M) + B, % and corresponding solution values U(I). The system of % M equations is: % % U(1) = LAMBDA * UA % % - U(I-1) + 2 * U(I) - U(I+1) = 2 * H * LAMBDA * G ( T(I), U(I), LAMBDA ) % % U(M) = LAMBDA * UB % % Licensing: % % This code is distributed under the GNU LGPL license. % % Modified: % % 03 September 2008 % % Author: % % John Burkardt % % Reference: % % SJ Polak, A Wachten, H Vaes, A deBeer, Cor denHeijer,
% A Continuation Method for the Calculation of Electrostatic % Potentials in Semiconductors,
% Technical Report ISA-TIS/CARD,
% NV Philips Gloeilampen-Fabrieken, 1979. % % Cor denHeijer, Werner Rheinboldt, % On Steplength Algorithms for a Class of Continuation Methods, % SIAM Journal on Numerical Analysis, % Volume 18, Number 5, October 1981, pages 925-947. % % Parameters: % % Input, integer OPTION, the option index. % % Input, integer NVAR, the number of variables. % % Input, real X(NVAR), the argument of the function. % % Output, real FX(NVAR-1), the value of the function at X. % a = 0.0; b = 0.01; ua = 0.0; ub = 25.0; lambda = u(nvar); m = nvar - 1; h = 1.0 / ( m - 1 ); fx(1) = u(1) - lambda * ua; for i = 2 : m - 1 t = ( ( m - i ) * a + ( i - 1 ) * b ) / ( m - 1 ); del2x = ( u(i-1) - 2.0 * u(i) + u(i+1) ) / ( 2.0 * h ); fx(i) = del2x - p18_gx ( t, u(i), lambda ); end fx(m) = u(m) - lambda * ub; return end