adams求解微分方程组

clear all;
clc;
x0 = 1;
b = 1; 
y0 = 1;
z0 = 1; 
t0 = 0;
h = 0.1;
df = @diff;
[k,X,Y] = Adams4t(df,t0,b,x0,y0,z0,h);
% temp = exact(X);
% plot(X,Y,'r',X,temp,'*');
plot(X,Y,'*');
legend('x','y','z');
% function result = exact(x)
%      result = 3./(1+x.^3);%exp(-5*x);
% end
% function result = diff(x,y)
%     result = -x.^2.*y.^2;%-5*x;%x.^3 - y./x;
% end
function result = diff(t,Y)
    x = Y(1);
    y = Y(2);
    z = Y(3);
    result(1) = y + 3*z +sin(5*t); 
    result(2) = x +cos(t);
    result(3) = x + z - 3*cos(3*t)*sin(4*t);
%     result(1) = -10*x + 10*y; 
%     result(2) = 28*x - y - x.*z;
%     result(3) = x.*y - 8/3*z;
end
function [k,T,Y] = Adams4t(funcfcn,t0,b,x0,y0,z0,h)
t = t0;
y = [x0,y0,z0];
p = 128; 
n = fix((b-t0)/h);
if n<5
	return;
end
T = zeros(p,1);%自变量是t,
Y = zeros(p,length(y)); f = zeros(p,length(y));
k = 1; T(k) = t0; Y(k,:) = y';
for k =2:4
	c1 = 1/6; c2 = 2/6;  c3 = 2/6;
	c4 = 1/6; a2 = 1/2;  a3 = 1/2;
	a4 = 1;   b21 = 1/2; b31 = 0;
	b32 = 1/2;b41 = 0;   b42 = 0;  b43 = 1;
	t1 = t+a2*h; t2 = t+a3*h;
	t3 = t+a4*h; 
    k1 = feval(funcfcn,t,y);
	y1 = y+b21*h*k1; 
    t = t+h;
	k2 = feval(funcfcn,t1,y1);
	y2 = y+b31*h*k1+b32*h*k2;
	k3 = feval(funcfcn,t2,y2);
    y3 = y+b41*h*k1+b42*h*k2+b43*h*k3;%y3 = y+h*k3;    
	k4 = feval(funcfcn,t3,y3);
	y = y+h*(c1*k1+c2*k2+c3*k3+c4*k4); %y = y+h*(1/6*k1+...+1/6*k4);
    T(k) = t; Y(k,:) = y';
end
for i = 1:4
    f(i,:) = feval(funcfcn,T(i),Y(i,:));
end
count_max = 100;%隐函数的最大迭代次数
 
for k = 4:n
    T(k+1) = T(1) + h*k;
    f(k+1,:) = feval(funcfcn,T(k+1),Y(k,:));
    count = 1;
    du = 1;
    
        while du>1e-6 && count <count_max
            for index = 1:length(y)
                s1(index) = Y(k,index) +(h/24)*sum(((f(k-2:k+1,index))'.*[1 -5 19 9]));
            end
            f(k+1,:) = feval(funcfcn,T(k+1),s1(:));
            for index = 1:length(y)
                s2(index) = Y(k,index) +(h/24)*sum(((f(k-2:k+1,index))'.*[1 -5 19 9]));
            end
            Y(k+1,:) = s2;
            du = max(abs(s2-s1));
            count = count+1;
        end
end
  %Y(k+1) = Y(k) +(h/24)*sum(((f(k-2:k+1))'.*[1 -5 19 9]));
% for k = 4:n
% 	f(k) = feval(funcfcn,X(k),Y(k));
% 	X(k+1) = X(1) + h*k;
% 	Y(k+1) = Y(k) +(h/24)*sum(((f(k-3:k))'.*[-9 37 -59 55]));
%     
% % 	f(k+1) = feval(funcfcn,X(k+1),Y(k+1));%预估校正公式
% %     Y(k+1) = Y(k) +(h/24)*sum(((f(k-2:k+1))'.*[1 -5 19 9]));
%  
% end
 
T = T(1:n+1);
Y = Y(1:n+1,:);
n = 1:n+1;
% wucha = wucha(1:n,:);
end

上一篇是求方程,这一篇是求方程组,采用的算例为四阶龙格库塔方法求解一次常微分方程组_HelloWorldTM的博客-CSDN博客,他是用RK,这里使用多步法

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值