Using “subs” Function to Evaluate Output of “dsolve” Give Extra Output in Maltab

二次信任 提交于 2019-12-11 15:16:47

问题


Introduction

If you want to know the grand scheme... read the introduction. If not, Just skip down to My Problem.

I have a project for my Differential Equations and Linear Algebra course where I have to use a computer algebra system to solve both linear, ordinary differential equations of the first degree with constant coefficients and a non-linear ODE with constant coefficients. I have to show this being done both analytically and numerically. My plan is to have 2 functions that make use of the dsolve function for the analytical part and a function called ODE1 I learned about through this tutorial by Matlab. This function is defined to approximate the solution to the differential equation using Euler's Method. The functions would all use the same input parameters so each input could be defined once and the functions would all understand what inputs to use (maybe nest the functions under one calling function). The goal is to evaluate the analytical solution over the same interval being used to find the numerical approximation and compare the results in both a table and graph. I got the numerical solution to give me a "table" in the form of a row vector and also graph that row vector. I began having an issue with the Analytic solution...

My Problem

To solve a linear ODE of the first order, I generated this function

function [s1] = L_Analytic(eqn,t0,h,numstep,y0)

% eqn is the differential equation to be solved
% t0 is the start of the interval that the resulting equation is to be evaluated at
% h is the stepsize
% numstep is the number of steps
% y0 is the initial condition

syms y(x)
cond = y(0) == y0;
A = dsolve(eqn,cond);
s1 = A;
S1 = s1;
   for t = t0 : h : h*(numstep-2)
       S1 = [subs(S1); vpa(subs(s1))]
   end 
end

The list generated by this function L_Analytic(diff(y)==y, 0, 0.1, 5, 1) is

1
1.0
1.105170...
1.221402...
1.349858...

When using the numerical method in a different function in Matlab using the same inputs, I get the list:

1.0000
1.1000
1.2100
1.3310
1.4641

For those who know their way around differential equations or are proficient in calculus, the solution to y' = y is e^x, and when evaluated over the interval 0:0.4 using 5 steps, the list should be

1
1.105...
1.2214...
1.3498...
1.4918...

after some rounding.

So the issue here is that I have an extra entry of 1 in my analytical solutions. I'm confident it has something to do with the subs(S1) part of S1 = [subs(S1); vpa(subs(s1))] in the for loop but I am stumped as to how to fix this.

I kind of understand why I need to use the subs function, in that I am using symbolic variables to use the dsolve function which outputs symbolic variables in its answer. Also, in order for the for loop to iterate and change, the symbolic variables must be substituted for real values of t each time. I did try moving the vpa(subs(s1)) just before the for loop, but this just returned the same value in the vector 5 times. I also tried not using subs(S1) and it gave me

exp(t)
1.0
1.1051709...
1.2214027...
1.3498588...

so I'm positive it's this part of the code.

Side Note: I understand the analytical method outputs a column vector as does the ODE1 shown in the video that's linked. In order to have Matlab plot this as one line, I transposed the column vector to make a row vector and will do the same with the analytical solution once the solution part is fixed.


回答1:


By changing the internals of the for loop I made it work. My final function code turned out to be this: function [s1] = L_Analytic3(eqn,t0,h,numstep,y0)

%Differential Equation solver for specific inputs
%   eqn is the differential equation
%   t0 is start of evaluation interval
%   h is stepize
%   numstep is the number of steps
%   y0 is the initial condition

syms y(x)
cond = y(0) == y0;
A = dsolve(eqn, cond);
s1 = A;
S1 = s1;
for x = t0 : h : h*(numstep)
    subs(x);
    if x == t0    
        S1 = subs(s1,x);
    else 
      S1 = [subs(S1), subs(s1,vpa(x))];
    end
end
end


来源:https://stackoverflow.com/questions/50902603/using-subs-function-to-evaluate-output-of-dsolve-give-extra-output-in-maltab

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!