シューティング法を使用して、MATLAB で境界値問題を解こうとしています。ただし、関数を fsolve に渡そうとすると、次のような警告が表示されます。時刻 t で許容される最小値 (2.273737e-013) よりもステップ サイズを小さくしないと、積分許容誤差を満たすことができません。
さまざまな ODE ソルバーを使用したり、ODE ソルブと fsolve の許容誤差を変更したりするなど、一般的な回避策をいくつか試しましたが、役に立ちませんでした。現在、自分のパラメータで fsolve を実行しても何も変わらず、最初の推測と同じです。
メイン スクリプト ファイルのコードと、fsolve によって呼び出される関数ファイルを含めました。
%% Main file
% PARAMETERS
% propanol (fig2, curve3, p337)
E=6.5; %2.5
K=0.0474;
% GUESSES
infinity=100; % numerical approximation of infinity
x=0; % expanded around x=0
x0=3;
B0=-2*10^(-8);
B1=0.01;
% Guess for P
P=-1+3*B0*(1-(E/(K+1)))*exp((x-x0)*sqrt(3*E/(K+1)));
% Guess for P'
PI=sqrt(3*E/(K+1))*3*B0*(1-(E/(K+1)))*exp((x-x0)*sqrt(3*E/(K+1)));
% Guess for H
H=1+B0*exp((x-x0)*sqrt(3*E/(K+1)))+B1*exp((x-x0)*sqrt(3));
% Guess for H' (contact angle in degrees)
HI=sqrt(3*E/(K+1))*B0*exp((x-x0)*sqrt(3*E/(K+1)))+sqrt(3)*B1*exp((x-x0)*sqrt(3));
% FUNCTION
f=@(t,x) [x(2); ...
3*E*(1+x(1))/((1+K*x(3))*(x(3))^3) - 3*x(2) * x(4)/(x(3));...
x(4);...
-1/(x(3)^3) - x(1)];
% SHOOTING METHOD
tspan=[-infinity, infinity];
myguess=[P, PI, H, HI]; % initial guess for P', H'
[actualvalue, Fval, exitflag]=fsolve('shootingfunc_thin_100',myguess);
init=actualvalue; % new initial paramaters
[t,X]=ode45(f,tspan,init);
%% Function file
function [ f ] = shootingfunc_thin_100( a )
%shootingfunc_thin: Shooting from thin to thick
% optimizes P=0 at infinity only
E=6.5;
K=0.0474;
fun=@(t,x) [x(2); ...
3*E*(1+x(1))/((1+K*x(3))*(x(3))^3) - 3*x(2) * x(4)/(x(3));...
x(4);...
-1/(x(3)^3) - x(1)];
infinity=10^2;
tspan=[-infinity, infinity];
init=[-1 a(2) 1 a(4)]; % initial conditions at thin
%options=odeset('RelTol',1e-10); %'RelTol',1e-16
[t,x]=ode45(fun,tspan,init);
f=x(end,1);
end