Краевая задача в MATLAB, проблема с fsolve - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь решить и ODE с граничными условиями на 0 и end, ws.mat можно загрузить на https://gofile.io/?c=RYzPsO

clear all
clc
global omega eta_max_ode eta F T Tp

eta_max_ode = 10;
omega=0.76;

load('ws','T','Tp','F','eta')
IC=[0,1];

opt = optimset('Display','off','TolFun',1E-20);
FI = fsolve(@(FI) eval_boundary_UVWTI(FI),IC,opt)
[eta_ode_i, fg_ode_i] = solve_UVWTI(FI);

sol_i = [fg_ode_i];
eta_i = eta_ode_i;
plot(eta_i,sol_i(:,1))

function [dfi]=UVWTI(t,fi)
global omega eta_max_ode eta F T Tp

for i=1:length(eta)
    if eta(i)<t
    else
        inde=i;
        break
    end
end

A11=0;
A12=1;

A21=0;
A22=-(T(inde)^(1-omega))*F(inde)-omega*Tp(inde)/T(inde)+Tp(inde)/T(inde);

dfi=zeros(2,1);
dfi(1)=A11*fi(1)+A12*fi(2);
dfi(2)=A21*fi(1)+A22*fi(2);

end

function [eta_ode_i, fg_ode_i] = solve_UVWTI(FI)
global eta_max_ode eta

options = odeset('RelTol',1e-9,'AbsTol',1e-9);

[eta_ode_i, fg_ode_i] = ode45(@UVWTI,eta,FI,options); 
size(fg_ode_i);
end

function [gi] = eval_boundary_UVWTI(FI)
% Get the solution to the ODE with inital condition F
[eta_ode_i, fg_ode_i] = solve_UVWTI(FI);
% Get the function values (for BCs) at the starting/end points

w_start = fg_ode_i(1,1); %w(0) = 0
w_end = fg_ode_i(end,1); %w(inf) = 0

% Evaluate the boundary function
gi = [
     w_start
     w_end - 1
     ];
end

Я получил правильное поведение это решение, стремящееся к константе. Тем не менее, я должен получить sol_i (:, 1), стремящееся к 1, и fsolve, похоже, не вычисляет правильное начальное условие, чтобы это произошло. Что не так в коде? eval_boundary_UVWTI () кажется правильным

...