寻找柯西问题的解决方案。在 Matlab 中
Finding solution to Cauchy prob. in Matlab
我需要一些帮助来解决 Matlab 中的柯西问题。
问题:
y''+10xy = 0, y(0) = 7, y '(0) = 3
我还需要绘制图表。
我写了一些代码,但我不确定它是否正确。特别是在功能部分。
有人可以检查吗?如果不正确,我在哪里弄错了?
这是其他 .m 文件中的单独函数:
function dydx = funpr12(x,y)
dydx = y(2)+10*x*y
end
主要:
%% Cauchy problem
clear all, clc
xint = [0,5]; % interval
y0 = [7;3]; % initial conditions
% numerical solution using ode45
sol = ode45(@funpr12,xint,y0);
xx = [0:0.01:5]; % vector of x values
y = deval(sol,xx); % vector of y values
plot(xx,y(1,:),'r', 'LineWidth',3)
legend('y1(x)')
xlabel('x')
ylabel('y(x)')
我得到这张图:
ode45
及其相关同类产品仅用于求解 一阶 形式为 y' = ...
的微分方程。如果你想解决二阶微分问题,你需要做一些工作。
具体来说,您必须将您的问题表示为一阶微分方程的系统。您目前有以下 ODE:
y'' + 10xy = 0, y(0) = 7, y'(0) = 3
如果我们重新排列它来求解 y''
,我们得到:
y'' = -10xy, y(0) = 7, y'(0) = 3
接下来,您需要使用两个变量...将其命名为 y1
和 y2
,这样:
y1 = y
y2 = y'
您为 ode45
构建代码的方式,您指定的初始条件正是这样 - 使用 y
的猜测及其一阶猜测 y'
。
对每一边求导得到:
y1' = y'
y2' = y''
现在,做一些最终的代入,我们得到这个最终的一阶微分方程组:
y1' = y2
y2' = -10*x*y1
如果您看不到这个,请记住 y1 = y
、y2 = y'
,最后是 y2' = y'' = -10*x*y = -10*x*y1
。因此,您现在需要构建函数,使其看起来像这样:
function dydx = funpr12(x,y)
y1 = y(2);
y2 = -10*x*y(1);
dydx = [y1 y2];
end
请记住,向量 y
是一个二元向量,它分别表示 y
的值和 y'
的值在 x
指定的每个时间点.我还认为将其设为匿名函数会更简洁。它需要更少的代码:
funpr12 = @(x,y) [y(2); -10*x*y(1)];
现在继续解决它(使用你的代码):
%%// Cauchy problem
clear all, clc
funpr12 = @(x,y) [y(2); -10*x*y(1)]; %// Change
xint = [0,5]; % interval
y0 = [7;3]; % initial conditions
% numerical solution using ode45
sol = ode45(funpr12,xint,y0); %// Change - already a handle
xx = [0:0.01:5]; % vector of x values
y = deval(sol,xx); % vector of y values
plot(xx,y(1,:),'r', 'LineWidth',3)
legend('y1(x)')
xlabel('x')
ylabel('y(x)')
请注意,通过deval
模拟微分方程的解时,输出将是一个两列矩阵。第一列是系统的解,第二列是解的导数。因此,您需要绘制第一列,这就是绘图语法所做的。
我现在得到这个情节:
我需要一些帮助来解决 Matlab 中的柯西问题。
问题:
y''+10xy = 0, y(0) = 7, y '(0) = 3
我还需要绘制图表。
我写了一些代码,但我不确定它是否正确。特别是在功能部分。
有人可以检查吗?如果不正确,我在哪里弄错了?
这是其他 .m 文件中的单独函数:
function dydx = funpr12(x,y)
dydx = y(2)+10*x*y
end
主要:
%% Cauchy problem
clear all, clc
xint = [0,5]; % interval
y0 = [7;3]; % initial conditions
% numerical solution using ode45
sol = ode45(@funpr12,xint,y0);
xx = [0:0.01:5]; % vector of x values
y = deval(sol,xx); % vector of y values
plot(xx,y(1,:),'r', 'LineWidth',3)
legend('y1(x)')
xlabel('x')
ylabel('y(x)')
我得到这张图:
ode45
及其相关同类产品仅用于求解 一阶 形式为 y' = ...
的微分方程。如果你想解决二阶微分问题,你需要做一些工作。
具体来说,您必须将您的问题表示为一阶微分方程的系统。您目前有以下 ODE:
y'' + 10xy = 0, y(0) = 7, y'(0) = 3
如果我们重新排列它来求解 y''
,我们得到:
y'' = -10xy, y(0) = 7, y'(0) = 3
接下来,您需要使用两个变量...将其命名为 y1
和 y2
,这样:
y1 = y
y2 = y'
您为 ode45
构建代码的方式,您指定的初始条件正是这样 - 使用 y
的猜测及其一阶猜测 y'
。
对每一边求导得到:
y1' = y'
y2' = y''
现在,做一些最终的代入,我们得到这个最终的一阶微分方程组:
y1' = y2
y2' = -10*x*y1
如果您看不到这个,请记住 y1 = y
、y2 = y'
,最后是 y2' = y'' = -10*x*y = -10*x*y1
。因此,您现在需要构建函数,使其看起来像这样:
function dydx = funpr12(x,y)
y1 = y(2);
y2 = -10*x*y(1);
dydx = [y1 y2];
end
请记住,向量 y
是一个二元向量,它分别表示 y
的值和 y'
的值在 x
指定的每个时间点.我还认为将其设为匿名函数会更简洁。它需要更少的代码:
funpr12 = @(x,y) [y(2); -10*x*y(1)];
现在继续解决它(使用你的代码):
%%// Cauchy problem
clear all, clc
funpr12 = @(x,y) [y(2); -10*x*y(1)]; %// Change
xint = [0,5]; % interval
y0 = [7;3]; % initial conditions
% numerical solution using ode45
sol = ode45(funpr12,xint,y0); %// Change - already a handle
xx = [0:0.01:5]; % vector of x values
y = deval(sol,xx); % vector of y values
plot(xx,y(1,:),'r', 'LineWidth',3)
legend('y1(x)')
xlabel('x')
ylabel('y(x)')
请注意,通过deval
模拟微分方程的解时,输出将是一个两列矩阵。第一列是系统的解,第二列是解的导数。因此,您需要绘制第一列,这就是绘图语法所做的。
我现在得到这个情节: