Matlab ODE45 with parameters which depend on the solution

1 回表示 (過去 30 日間)
Caglar Guerbuez
Caglar Guerbuez 2017 年 5 月 19 日
編集済み: Caglar Guerbuez 2017 年 5 月 22 日
I am trying to solve an ordinary differential equation with Matlabs ODE45 function. This works very fine with constant parameters. Now, I want to declare my parameters such that they depend on the solution at the last time step. The code looks like this
[t,q] = ode45(@ems,[t_begin t_end],initCondition);
In my function ems, there is a parameter which depends on q at the last time step. ODE45 solves my function for the entire time span. I am not interested in, how to "pause" the solver at each time step in order to assign the solution q to my function to be solved.

回答 (2 件)

Torsten
Torsten 2017 年 5 月 19 日
編集済み: Torsten 2017 年 5 月 19 日
If you want to reset a parameter after each successful time step taken by the solver, you can use the "OutputFcn" routine (see the options structure of ODE45).
But note that MATLAB's ODE-integrators use adaptive time stepping. So the length of the time steps vary during integration. It might be better to use your own solver with fixed time stepping instead.
Best wishes
Torsten.
  5 件のコメント
Caglar Guerbuez
Caglar Guerbuez 2017 年 5 月 22 日
Hi Torsten, since my results seem odd, I am not sure if I implemented it correctly. Especially line k = var_k(q(1),table);
The problem is that my number of step size are much higher when k is dependent on q.
Torsten
Torsten 2017 年 5 月 22 日
We don't know what function "var_k" does and how you call the ODE solver, but if "var_k" interpolates the value of k to the value of q(1), the code should work.
Best wishes
Torsten.

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


Jan
Jan 2017 年 5 月 22 日
var_k(q(1),table) could mean in interpolation. If this is linear, remember that Matlab's integrators are designed to integrate differentiable functions only. Otherwise the stepsize controller is driven out of its purpose. See also http://www.mathworks.com/matlabcentral/answers/59582#answer_72047 .
Are you aware that the details about the function var_k matter the problem? Then it would be useful to show us, what happens inside this function.
  1 件のコメント
Caglar Guerbuez
Caglar Guerbuez 2017 年 5 月 22 日
編集済み: Caglar Guerbuez 2017 年 5 月 22 日
Hi Jan, indeed there is a linear interpolation in that function
function c_out = var_k(displacement,table)
table_c = zeros(size(table,1),size(table,2));
table_c(:,1) = table(:,1);
table_c(:,2) = gradient(table(:,2));
cq = interp1(table_c(:,1),table_c(:,2),displacement);
c_out = cq;
And as you suggested, the step size gets very small which indicates a problem in the integration scheme (your third point at the referenced thread). How can I fix this problem?

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

カテゴリ

Help Center および File ExchangeOrdinary Differential Equations についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by