Matlab ode45/F解决BVP射击方法解决方案问题

Matlab ode45/F解决BVP射击方法解决方案问题,matlab,optimization,differential-equations,ode,Matlab,Optimization,Differential Equations,Ode,我试图用打靶法在MATLAB中解决一个边值问题。但是,当我尝试通过fsolve传递函数时,会收到如下警告: 警告:t=-9.462647e+001处出现故障。如果不将步长减小到最小值以下,则无法满足集成公差 在时间t允许(2.2737E-013) 我尝试过一些常见的解决方法,比如使用不同的ODE解算器,以及在ODE solve和fsolve中更改公差,但没有效果。目前,当我在参数上运行fsolve时,它不会改变任何内容,并且与我最初的猜测相同 我已经包括了主脚本文件的代码以及fsolve调用的函

我试图用打靶法在MATLAB中解决一个边值问题。但是,当我尝试通过fsolve传递函数时,会收到如下警告: 警告:t=-9.462647e+001处出现故障。如果不将步长减小到最小值以下,则无法满足集成公差 在时间t允许(2.2737E-013)

我尝试过一些常见的解决方法,比如使用不同的ODE解算器,以及在ODE solve和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

它实际上是给出错误还是只给出警告?如果出现错误,您可能希望使用
dbstop运行它;如果出现警告,您可能希望使用
dbstop运行它。它发出警告并继续运行,但最终什么也不做。fsolve返回的值与输入的值相同。ode45第367页的警告是
>,您能否说明您正在集成的ODE及其背后的BVP?直接从代码中推断出这一点对某些人来说是一项繁重的任务,甚至在他们还没有考虑到底出了什么问题之前。我很好奇为什么ode45上的时间跨度是-inf到inf。。。它不应该结束或开始?