matlab - 寻找柯西问题的解。在Matlab中

标签 matlab numerical-methods ode differential-equations

我需要一些帮助来在 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)')

我得到这个图表:

Here is the graph

最佳答案

ode45 及其相关同类仅设计用于求解形式为 y' = ...一阶微分方程。 。如果你想解决二阶微分问题,你需要做一些工作。

具体来说,您必须将问题表示为一阶微分方程系统。您当前拥有以下 ODE:

 y'' + 10xy = 0, y(0) = 7, y'(0) = 3

如果我们重新排列它来解决 y'' ,我们得到:

y'' = -10xy, y(0) = 7, y'(0) = 3

接下来,您需要使用两个变量...将其命名为 y1y2 ,这样:

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 模拟微分方程的解时的输出将是一个两列矩阵。第一列是系统的解,第二列是该解的导数。因此,您需要绘制第一列,这就是绘图语法的作用。

我现在得到这个情节:

enter image description here

关于matlab - 寻找柯西问题的解。在Matlab中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34273482/

相关文章:

animation - 在 Julia 中删除以前的数据/图(Plots.jl,GR 后端)

xmlns 声明破坏了我的 xPath 过滤器

python - Scipy optimize.curve_fit 有时不会收敛

c - 如何在 C 语言中对程序中正在计算的变量进行数值积分作为指针(使用例如梯形规则)

谁能确认我(欧拉法)对这些常微分方程的实现?

python - 通过 matplotlib 绘制 3 ODE 系统的相图

matlab - 在 MATLAB 中取最大值的连续矩阵 block

matlab - 如何将元胞数组应用于带有目录的 Matlab exist()?

Matlab从数组设置参数

python - 通过迭代方法估计 Spring 的速度