Matlab - ode的数值求解系统
Matlab - numerical solution system of ode
我想用我自己的 runge kutty 方法在 matlab 中求解以下微分方程组:
$\frac{dx_{1}{dt}$ = $x_{2}$
$\frac{dx_{2}{dt}$ = A $x_{1} + B $x_{2}$ + asin(Ct)
我写了
function xdot = NaszModel(x, aa, bb, AA, BB, CC)
a= aa;
A = AA;
B = BB;
C = CC;
xdot = [ x(2)
A*x(1) - B*x(2) + a*sin(C)];
end
function [x, t] = RK(f, x0, t0, T, h)
t = t0:h:T;
nt = numel(t);
nx = numel(x0);
x = nan(nx, nt);
x(:,1) = x0;
for k = 1:nt-1
k1 = h*f(t(k), x(:,k));
k2 = h*f(t(k) + h/3 , x(:,k) + h/3 );
k3 = h*f(t(k) + (2*h)/3, x(:,k) - k1/3 + k2);
k4 = h*f(t(k) + h, x(:,k) + k1 - k2 + k3);
dx = (k1 + 3*k2 + 3*k3 + k4)/8;
x(:,k+1) = x(:,k) + dx;
end
end
a = 1;
A = 0.1;
B = 0.1;
C = 1;
f = @(t,x) NaszModel(x, a, b, A, B, C);
x0 = [1, 0];
t0 = 0;
T = 100;
h = 1;
[x, t] = RK(f, x0, t0, T, h);
plot(t,x);
legend('x', 'v');
plot(x(1,:), x(2,:));
xlabel('x');
ylabel('v(x)');
一切正常,但当我试图将 t 添加到 sin 时,我的意思是:我的解决方案中有 asin(C),但我必须用 a[=24= 求解方程]罪恶(C*t)。 `
应该如何编写才能使其也适用于 asin(Ct)?
您还需要将 t
传递给模型函数,然后您也可以在 ODE 中使用它。这意味着你需要改变函数的接口。
function xdot = NaszModel(t, x, a, b, A, B, C)
xdot = [ x(2)
A*x(1) - B*x(2) + a*sin(C*t)];
end
f = @(t,x) NaszModel(t, x, a, b, A, B, C);
我想用我自己的 runge kutty 方法在 matlab 中求解以下微分方程组:
$\frac{dx_{1}{dt}$ = $x_{2}$
$\frac{dx_{2}{dt}$ = A $x_{1} + B $x_{2}$ + asin(Ct)
我写了
function xdot = NaszModel(x, aa, bb, AA, BB, CC)
a= aa;
A = AA;
B = BB;
C = CC;
xdot = [ x(2)
A*x(1) - B*x(2) + a*sin(C)];
end
function [x, t] = RK(f, x0, t0, T, h)
t = t0:h:T;
nt = numel(t);
nx = numel(x0);
x = nan(nx, nt);
x(:,1) = x0;
for k = 1:nt-1
k1 = h*f(t(k), x(:,k));
k2 = h*f(t(k) + h/3 , x(:,k) + h/3 );
k3 = h*f(t(k) + (2*h)/3, x(:,k) - k1/3 + k2);
k4 = h*f(t(k) + h, x(:,k) + k1 - k2 + k3);
dx = (k1 + 3*k2 + 3*k3 + k4)/8;
x(:,k+1) = x(:,k) + dx;
end
end
a = 1;
A = 0.1;
B = 0.1;
C = 1;
f = @(t,x) NaszModel(x, a, b, A, B, C);
x0 = [1, 0];
t0 = 0;
T = 100;
h = 1;
[x, t] = RK(f, x0, t0, T, h);
plot(t,x);
legend('x', 'v');
plot(x(1,:), x(2,:));
xlabel('x');
ylabel('v(x)');
一切正常,但当我试图将 t 添加到 sin 时,我的意思是:我的解决方案中有 asin(C),但我必须用 a[=24= 求解方程]罪恶(C*t)。 `
应该如何编写才能使其也适用于 asin(Ct)?
您还需要将 t
传递给模型函数,然后您也可以在 ODE 中使用它。这意味着你需要改变函数的接口。
function xdot = NaszModel(t, x, a, b, A, B, C)
xdot = [ x(2)
A*x(1) - B*x(2) + a*sin(C*t)];
end
f = @(t,x) NaszModel(t, x, a, b, A, B, C);