Matlab 如何用一阶码解二阶方程?

Matlab 如何用一阶码解二阶方程?,matlab,Matlab,我用matlab解了一个常微分方程的一阶方程。方程为$$y'=t^2$$。现在我想用同样的代码来解二阶微分方程。y'(x)=-y,其中$y(0)=1$,而$y'(x=0)=0$ 如何更改下面的代码以便我可以找到y的值?我尝试的是,我把它变成了一阶微分方程,但我不知道如何修改代码 clc; % Clears the screen clear all; h=0.2;

我用matlab解了一个常微分方程的一阶方程。方程为$$y'=t^2$$。现在我想用同样的代码来解二阶微分方程。y'(x)=-y,其中$y(0)=1$,而$y'(x=0)=0$

如何更改下面的代码以便我可以找到y的值?我尝试的是,我把它变成了一阶微分方程,但我不知道如何修改代码

clc;                                               % Clears the screen
clear all;

h=0.2;                                             % step size
x = 0:h:1;                                         % Calculates upto y(3)
y = zeros(1,length(x)); 
y(1) = 1;                                          % initial condition
F_x = @(t) t.^2;                    % change the function as you desire

for i=1:(length(x)-1)                              % calculation loop
    k_1 = F_x(x(i));
    k_2 = F_x(x(i)+0.5*h);
    k_3 = F_x((x(i)+0.5*h));
    k_4 = F_x((x(i)+h));

    y(i+1) = y(i) + (1/6)*(k_1+2*k_2+2*k_3+k_4)*h;  % main equation
end

所以,你想把你的二阶颂歌分成两首一阶颂歌。所以你的方程组是

y'=u

u'=-y

在哪里

y(0)=1

u(0)=0

因此,我们可以修改您的程序


所以,你想把你的二阶颂歌分成两首一阶颂歌。所以你的方程组是

y'=u

u'=-y

在哪里

y(0)=1

u(0)=0

因此,我们可以修改您的程序


为什么
cellfun
?一个简单的匿名函数,如
F=@(x,y)[y(2);-y(1)](像标准的ODE套件界面)应该足够快了。为什么
cellfun
?一个简单的匿名函数,如
F=@(x,y)[y(2);-y(1)](像标准的ODE套件接口)应该足够快了。
function StackOverflow
close all
set(groot,'defaultLineLineWidth',3)

dx=pi/100;
x = (0:dx:2*pi)';
N = length(x);

Y = nan(size(x,1),2);
Y(1,:) = [1, 0];

F = { @(x,y)  y(2) , @(x,y) -y(1) };

for i=1:N-1                              % calculation loop
    k_1 = cellfun(@(f) f(x(i)         , Y(i,:))              , F);
    k_2 = cellfun(@(f) f(x(i) + 0.5*dx, Y(i,:) + 0.5*dx*k_1) , F);
    k_3 = cellfun(@(f) f(x(i) + 0.5*dx, Y(i,:) + 0.5*dx*k_2) , F);
    k_4 = cellfun(@(f) f(x(i) +     dx, Y(i,:) +     dx*k_3) , F);

    Y(i+1,:) = Y(i,:) + (dx/6)*(k_1+2*k_2+2*k_3+k_4);  % main equation
end

y = Y(:,1);
u = Y(:,2);

figure(1)
set(gcf, 'units', 'normalized')

subplot(2,1,1)
plot(x , y , '--', x, cos(x), ':')
axis('tight')
set(gca,'fontsize',14, 'Position',[0.12 0.55 0.84 0.4])
xticks(0:pi/2:2*pi)
xticklabels({})
ylabel('$y(x)=\cos(x)$', 'Interpreter', 'latex')


subplot(2,1,2)
plot(x , u, '--', x, -sin(x), ':')
set(gca,'fontsize',14, 'Position',[0.12 0.1 0.84 0.4])
axis('tight')
xticks(0:pi/2:2*pi)
xticklabels({'0', '\pi/2', '\pi', '3\pi/2', '2\pi'})

xlabel('x', 'Interpreter', 'latex')
ylabel('$y''(x)=-\sin(x)$', 'Interpreter', 'latex')

end