Неявный Euler Solver с Syms: Matlab - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь использовать библиотеку символов в Matlab для создания неявного (обратного) решателя Эйлера. Я продолжаю сталкиваться с проблемами либо с "размерами массивов, которые должны совпадать", либо с "ссылкой на содержимое ячейки из объекта массива, отличного от ячейки". Есть ли способ сделать то, что я хочу с библиотекой символов?

Используемая ниже решающая функция.

function [tp, yp] = backEuler(dydt,tspan,y0,h,varargin)
% dydt = system of equations/first order ODEs
% tspan = [ti  tf] start time and end time
% y0 = [ y(0) y'(0) ...] initial values
% h = step size
% varargin = various parameters for dydt
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if nargin<4,error('at least 4 input arguments required'), end
if any(diff(tspan)<=0),error('tspan not ascending order'), end
n = length(tspan);
ti = tspan(1);
tf = tspan(n);
if n == 2
    t = (ti:h:tf)';
    n = length(t);
    if t(n)<tf
        t(n+1) = tf;
        n = n+1;
    end
else
    t = tspan;
end
tt = ti;
y(1,:) = y0;
np = 1;
tp(np) = tt;
yp(np,:) = y(1,:);
i=1;

bb = sym('bb',[1 length(y)]); % array of symbols to match with values in y
while(1)
    tend = t(np+1);
    hh = t(np+1) - t(np);
    if hh>h,hh = h;end
    while(1)
        if tt+hh>tend,hh = tend-tt;end
        %y(i+1,:) = solve( bb == y(i,:) + hh*dydt(tt,bb,varargin{:}));

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % breaks here
    solve( bb(:) == y(i,:) + hh*dydt(tt,bb(:),varargin{:}));
    % I've tried using {:}, {:}(1), (:) for indexing on bb.
    % I've also looked at the workspace and every bb has the same 
    % basic dimensions as the output from dydt.
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %y(i+1,:) = y(i,:) + phi*hh;
       tt = tt+hh;
       i=i+1;
       if tt>=tend,break,end
   end
   np = np+1; tp(np) = tt; 
   yp(np,:) = y(i,:);
   if tt>=tf,break,end
end
...