Input argument for ode45 function type error

I am trying to modify the following code.
tspan = [0 10];
x0 = 0;
[t,x] = ode45(@(t,x) (-4.76e+1*x^2 + 5.69e-9*x + 7.98e-2)/(1.67e+4*x + 1.12), tspan, x0);
plot(t,x,'b')
xlim([0 0.001])
The input argument to the ode45 function is directly typed in. If instead you write it as
tspan = [0 10];
x0 = 0;
f = (-4.76e+1*x^2 + 5.69e-9*x + 7.98e-2)/(1.67e+4*x + 1.12);
[t,x] = ode45(@(t,x) f, tspan, x0);
plot(t,x,'b')
xlim([0 0.001])
then there is an error, even though the type of the argument is the same. Can anyone explain how the argument can be input as a variable that stores the expression?

 採用された回答

Star Strider
Star Strider 2021 年 11 月 7 日

0 投票

Yes.
Create it as an anonymous function at the outset —
tspan = [0 10];
x0 = 0;
f = @(t,x) (-4.76e+1*x^2 + 5.69e-9*x + 7.98e-2)/(1.67e+4*x + 1.12);
[t,x] = ode45(f, tspan, x0);
figure
plot(t,x,'b')
grid
xlim([0 0.001])
.

4 件のコメント

Aleem Andrew
Aleem Andrew 2021 年 11 月 7 日
Thank you for your help. The problem I was encountering is that I wanted to plot a symbolic expression using ode45 and the argument must be a function handle, so I converted the symbolic expression using matlabFunction but although it was converted to a function handle I still got an error.
syms x
f = (- 4.76e+67*x^2 + 5.69e+57*x + 7.98e+64)/(1.67e+70*x + 1.12e+66)
f = matlabFunction(f)
tspan = [0 10];
x0 = 0;
[t,x] = ode45(f, tspan, x0);
plot(t,x,'b')
grid
xlim([0 0.001])
How do you convert a symbolic expression like f to the appropriate type to be plotted using ode45?
Star Strider
Star Strider 2021 年 11 月 7 日
As always, my pleasure!
It is necessary to include the 'Vars' optional argument to matlabFucntion to get the correct result —
syms x t
f = (- 4.76e+67*x^2 + 5.69e+57*x + 7.98e+64)/(1.67e+70*x + 1.12e+66)
f = 
f = matlabFunction(f, 'Vars',{t,x})
f = function_handle with value:
@(t,x)(x.*5.69e+57-x.^2.*4.76e+67+7.98e+64)./(x.*1.67e+70+1.12e+66)
tspan = [0 10];
x0 = 0;
[t,x] = ode45(f, tspan, x0);
plot(t,x,'b')
grid
xlim([0 0.001])
Using 'Vars' so that the created function is of both ‘t’ and ‘x’ (and in the specified order of the ‘Vars’ matching value) creates a function that ode45 and the others can use.
Note — This also requries adding ‘t’ to the syms declaration.
.
Aleem Andrew
Aleem Andrew 2021 年 11 月 7 日
Thank you, I appreciate your help
Star Strider
Star Strider 2021 年 11 月 7 日
As always, my pleasure!
.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeSymbolic Math Toolbox についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by