【问题标题】:Finding solution to Cauchy prob. in Matlab寻找柯西问题的解决方案。在 Matlab 中
【发布时间】:2015-12-14 17:51:18
【问题描述】:

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

我得到这张图:

【问题讨论】:

    标签: matlab numerical-methods ode differential-equations


    【解决方案1】:

    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 = yy2 = 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 是一个二元向量,分别表示yy'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 模拟微分方程的解时的输出将是一个两列矩阵。第一列是系统的解决方案,而第二列是解决方案的导数。因此,您需要绘制第一列,这就是绘图语法正在做的事情。

    我现在得到了这个情节:

    【讨论】:

    • @rayryeng 感谢您的大力帮助和解释,一切都很好。我有一个问题,如何打印 dydx 的值?因为现在它只打印图表。
    • @Bestinthe 道歉,应该是disp([xx(:) y(1,:).'])。我暂时忘记了我们将求解一个微分方程组。 y 的第一列应该是解,第二列是它的导数。
    • @rayryeng 太棒了,再次非常感谢您!
    • @Bestinthe 这是我的荣幸。祝你好运!
    • @Bestinthe 如果我可以再提供一条建议,请尝试在disp 命令之前执行format long g;。如果准确性至关重要,这将增加显示结果的精度位数。
    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2023-03-21
    • 2019-01-16
    • 2020-10-12
    • 2014-07-20
    相关资源
    最近更新 更多