Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 18. 04. 2016 17:01

Tiesza
Zelenáč
Příspěvky: 6
Škola: VUT Brno
Pozice: Student
Reputace:   
 

Matlab - Řešení metodou Adams Moulton 6. řádu

Zdravím,

mám za úkol naprogramovat metodou AM6 následující rovnici

https://ctrlv.cz/shots/2016/04/18/59Ru.png

https://ctrlv.cz/shots/2016/04/18/2Ay3.png

metodu mám naprogramovanou zde:

function [t,y]=method(ode,tspan,y0,Q)
%% metoda AM6
%
% vstupni data:
%
% ode   ... prava strana diferencialni rovnice, funkce promennych (t,y),
%           pole typu (d,1)
% tspan ... interval, v nemz pocitame reseni, a=tspan(1) je pocatek,
%           b=tspan(end) je konec intervalu integrace, vektor delky d
% y0    ... pocatecni podminka, vektor delky d, y0(i) je pocateni
%           podminka pro i-tou slozku
% Q     ... pocet dilku, t(n)=a+n*tau, n=0,1,...,Q, kde tau=(b-a)/Q
%
% vystupni data:
%
% t ... deleni, pole typu (1,Q+1)
% y ... reseni, pole typu (Q+1,d), y(n,i) je i-ta slozka reseni v uzlu t(n)
%         
% vzorove volani:
%
% pomoci programu go.m:
% go(1) % ==> prvni testovaci priklad
% go(2) % ==> druhy testovaci priklad
%%
k=6;
milne=true;
if nargin<6, milne=true; end;

d=length(y0);        % pocet rovnic
a=tspan(1);          % zacatek integrace
b=tspan(end);        % konec integrace
tau=(b-a)/Q;         % delka kroku
t=linspace(a,b,Q+1); % deleni
y=zeros(Q+1,d);      % pseudodeklarace
f=zeros(Q+1,d);      % pseudodeklarace derivace reseni
y(1,:)=y0(:)';       % pocatecni podminka do prvniho radku
p(1,:)=ode(t(1),y(1,:)')';    % vlozeni odpovidajicich hodnot prave strany
atol=1e-14;          % absolutni tolerance
rtol=1e-12;          % relativni tolerance
tol=[atol rtol];     % tolerance pro solver nsoli

%startovací hodnoty dle PDF

tspan=[t(1),t(1)+(k-1)*tau]; % startovaci uzly
opt=odeset('AbsTol',1e-14,'RelTol',1e-11);
sol=ode45(ode,tspan,y0(:),opt);
yy=deval(sol,tspan(1):tau:tspan(2))';
y(1:k,:)=yy; %y(2:k,:)=yy(2:k,:);
for j=1:k,
     f(j,:)=ode(t(j),y(j,:)')';
end;
  atol=1e-12;      % absolutni tolerance pro solver nsoli
  rtol=1e-9;       % relativni tolerance pro solver nsoli
  tol=[atol rtol]; % tolerance pro solver nsoli

%% vypocet y_n, n=k+1,...,Q+1
est=0;  % pocatecni nastaveni pro urceni maximalni lokalni chyby
for n=k:Q     % cyklus pres jednotlive uzly deleni
  tn=t(n);    % uzel t_n                   
  yn=y(n,:)'; % reseni v uzlu t_n
  fn=f(n,:)'; % derivace v uzlu t_n

F=@(z) -z+yn+1/1440*tau*(475*f(tn,z)+1427*f(n,:)'-798*f(n-1,:)'+482*f(n-2,:)'-173*f(n-3,:)'+27*f(n-4,:)'); % C: AM6
z=nsoli(y(n,:)',F,tol)';           % reseni F(z)=0
y(n+1,:)=z; 
                                            %y(n+1,:)=nsoli(yn,F,tol)';                         % vlozeni ynew           
f(n+1,:)=ode(tn+tau,y_new)';             % E:
end

kdy mi ale dělá problém F=@(z), která musí projít přes funkci nsoli, čehož nemůžu dosáhnout. Pořád mi to vypisuje Subscript indices must either be real positive integers or logicals. Neví si s tím někdo rady?

Děkuji.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson