径鼓 - 库特第四顺序法的四个耦合非线性杂散系统的数值解

84次浏览(最近30天)
deva narayanan
deva narayanan 2020年7月30日
编辑: 詹姆斯Tursa 2020年7月30日
我正在尝试使用Runge-Kutta第四订单方法找出四个耦合非线性杂散系统的数值解决方案。我开发了这些方程式的MATLAB代码。但我无法获得正确的解决方案。我在本节中附上了MATLAB代码。如果在本准则中有任何错误,请任何人通知我。
a = 0;集成率下限
B = 1;%积分上限
h = 0.25;% h = delta_t
(1) = 1;
e(1)= 0;
我(1)= 1;
r(1)= 0;
N = (b-a)/h;%没有积分
t = a +(0:n)* h
% 解决方案
func1 = @ (S I) - ((0.5 *) + 0.25) *集成的%函数
func2 = @(e,i,s)(0.5 * s * i)-e集成的%函数
func3 = @(i,e)(0.75 * e) - (i)集成的%函数
func4 = @(r,i)(0.75 * i) - (0.25 * r)集成的%函数
% func_exact = @(t);
为了我= 1:n
k1 = func1(i(i),s(i));
k2 = feval(func1, I(I)+(k1/2),S(I)+(k1/2));
k3 = feval(func1,i(i)+(k2 * h / 2),s(i)+(k2 * h / 2));
k4 = feval(func1, I(I)+(k3*h),S(I)+(k3*h));
l1 = feval(func2,s(i),i(i),e(i));
l2 =函数宏指令(func2 S(我)+ (l1 * h / 2),我(我)+ (l1 * h / 2), E(我)+ (l1 * h / 2));
l3 =函数宏指令(func2 S(我)+ (l2 * h / 2),我(我)+ (l2 * h / 2), E(我)+ (l2 * h / 2));
L4 = FeVal(Func2,S(I)+(L3 * H),I(i)+(l3 * h),e(i)+(l3 * h));
m1 = feval(func3, E(i), i (i));
m2 = feval(func3, E(i)+(m1*h/2), i (i)+(m1*h/2));
m3 = feval(func3,e(i)+(m2 * h / 2),i(i)+(m2 * h / 2));
M4 = FeVal(Func3,E)+(H * M3),I(i)+(m3 * h));
n1 = feval(func4,i(i),r(i));
n2 = feval(func4,i(i)+(n1 * h / 2),r(i)+(n1 * h / 2));
n3 = feval(func4, I(I)+(n2*h/2),R(I)+(n2*h/2));
n4 = feval(func4, I(I)+(n3*h),R(I)+(n3*h));
S(I + 1)= S(i)+(H / 6)*(K1 +(2 *(k2 + k3))+ k4)
E(i + 1)= e(i)+(h / 6)*(l1 +(2 *(l2 + l3))+ l4)
i(i + 1)= i(i)+(h / 6)*(m1 +(2 *(m2 + m3))+ m4)
R(i + 1)= R(i)+(h / 6)*(n1 +(2 *(n2 + n3))+ n4)
结尾
格式银行
disp ('数值结果'),DISP(“我是啊);
DISP([T',S',E',I',R')

答案(1)

詹姆斯Tursa
詹姆斯Tursa 2020年7月30日
编辑:詹姆斯Tursa 2020年7月30日
我会指出一些问题,然后建议这样做的更简单。
从循环中的第一个行开始:
k1 = func1(i(i),s(i));
k2 = feval(func1, I(I)+(k1/2),S(I)+(k1/2));
FUNC1是DS / DT,因此S(i)+(K1 / 2)部分是正确的(几乎)。但我(i)+(k1/2)部分是 不是 正确,因为K1是DS / DT,它应该是此部分的DI / DT。你错过了h。也就是说,这些行应该看起来像这样:
k1 = func1(i(i),s(i));%ds / dt在t处
m1 = feval(func3, E(i), i (i));%di / dt在t
k2 = feval(func1, I(I)+(m1/2)*h,S(I)+(k1/2)*h);T + H / 2的%ds / dt
您的代码剩余有类似的问题。您需要首先评估所有K1,L1,M1,N1术语。然后使用这些来评估所有K2,L2,M2,N2术语。等等。不要在计算中混合K,L,M,N变量。k与s's一起去,我和我一起去,我和他一起去了。并且您需要在这些计算中包含H.
已经说明了这一切,如果你的一切繁拟,那么写入的代码会更容易和更少的代码,然后为衍生函数和RK4代码编写矢量方程。这样你就不必复制所有RK4的东西。例如,定义Y矢量
y (1) = S
Y(2)= e
y(3)=我
Y(4)= r
然后写 一个求导函数,以4个元素的y作为输入,返回4个元素的dy/dt作为输出。这样,您只需要一组RK4代码,而不是四组。以这种方式编码的另一个好处是,您可以直接将函数句柄和初始条件传递给ode45()函数,以再次检查您的答案。

社区宝藏狩猎

找到Matlab Central中的宝藏,并发现社区如何帮助您!

开始狩猎!