You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.6 KiB
81 lines
2.6 KiB
function [t_new,x_new,y_new,LTE,LTE2,LTE3] = DT(t,x,f,GLO,h,K)
|
|
% DT performs one-step integration of differential transformation
|
|
% method to solve differential equation dx/dt = f(t,x,GLO);
|
|
%
|
|
% Input
|
|
% k current order, 0,1,2,...
|
|
% x current states
|
|
% f differential equation
|
|
% GLO parameters in the differential equation
|
|
% h time step
|
|
% K The degree of power series: X(0)+X(1)*h+...X(K)*h^K
|
|
%
|
|
% Output
|
|
% t_new next time instant
|
|
% x_new next states of state variables
|
|
% y_new next states of algebraic variables
|
|
% LTE local truncation error
|
|
%
|
|
% See also rk4, Parareal
|
|
%
|
|
|
|
|
|
%% Function handle to compute intermidate variables
|
|
fun_y = str2func(strcat(func2str(f),'_AE'));
|
|
fun_idx = str2func(strcat(func2str(f),'_idx'));
|
|
|
|
%% Function handle for DT model X(k+1)=FB(X(0:k)) of differential equation dx/dt = f(x)
|
|
F = str2func(strcat(func2str(f),'_DT'));
|
|
|
|
%% compute intermidate variables y
|
|
idx = fun_idx(GLO);
|
|
y = fun_y(x,idx,GLO);
|
|
|
|
%% Define matrix X Y to store coefficients, Xh to store terms
|
|
Nx = length(x);
|
|
X = zeros(Nx,K+1); %%why NAN
|
|
|
|
Ny = length(y);
|
|
Y = zeros(Ny,K+1);
|
|
|
|
Xh= zeros(Nx,K+1);
|
|
Yh= zeros(Ny,K+1);
|
|
%% Initialize the 0th order coefficients
|
|
X(:,1) = x;
|
|
Y(:,1) = y;
|
|
|
|
Xh(:,1) = x; % Term(0) = X(0)*h^0
|
|
Yh(:,1) = y;
|
|
%% Perform recursive calculation of high order coefficients and terms
|
|
for k = 0:K-1
|
|
% for k = 0:K-2
|
|
%% DT Equation: X(k+1)=F(X(0:k)) or XX(k+2)=F(XX(1:k+1))
|
|
[X,Y] = F(k,X,Y,GLO,idx);
|
|
Xh(:,k+2) = X(:,k+2)*h^(k+1); % Term(k+1) = X(k+1)*h^(k+1) or XX(k+2)*h^(k+1)
|
|
Yh(:,k+2) = Y(:,k+2)*h^(k+1); % Term(k+1) = X(k+1)*h^(k+1) or XX(k+2)*h^(k+1)
|
|
|
|
end
|
|
|
|
%% sum over all columns of matrix Xh to obtain x_new as a column vector
|
|
x_new = sum(Xh(:,1:end-1),2);
|
|
|
|
%%
|
|
% y_new = sum(Yh,2);
|
|
y_new = fun_y(x_new,idx,GLO);
|
|
%% Update time
|
|
t_new = t + h;
|
|
eta = 0.0000000000000000001;
|
|
%% Local truncation error: last term; maximum value over all variables
|
|
% khuang: we can use relative error, since different variables have
|
|
% differnet dynamics and quantities
|
|
infcof = max(abs(Xh(:,end)./(x_new+eta)));
|
|
trc = infcof^(1/K);
|
|
LTE = infcof/(1-trc);
|
|
% LTE = infcof;
|
|
% LTE = max(abs(Xh(:,end)./x_new));
|
|
LTE3 = max(abs(Xh(:,end-1)./(x_new+eta)));
|
|
|
|
% relative error used to change order
|
|
LTE2 = infcof/min([norm(Xh(:,end-1)./Xh(:,end),Inf), sqrt(norm(Xh(:,end-2)./Xh(:,end),Inf)), sqrt(norm(Xh(:,end-3)./Xh(:,end-1),Inf))]);
|
|
% LTE2 = min(abs(Xh(:,end)./abs(Xh(:,end-1))))
|
|
end |