How to add additional input to Ode45 function

조회 수: 6 (최근 30일)
Nicola Zappacosta
Nicola Zappacosta 2019년 11월 25일
댓글: darova 2019년 11월 25일
Hello, i need to optimaze the code of a PSO search for the interplanetary transefer exercise.
I accomplished the exercise using globals but it results quite slow, so i wanted to add the constants parameters as the input of the integration function of the ODE45 as follows:
function dw = eqni_archi(t,X,alfa,beta,mi)
dw(1)=X(3);
dw(2)=X(4)/X(1);
dw(3)=X(4)^2/X(1)-mi/X(1)^2+beta/X(1)^2*cos(alfa)^3;
dw(4)=-X(3)*X(4)/X(1)+beta/X(1)^2*cos(alfa)^2*sin(alfa);
end
then i wrote the valuating function script for the PSO has follow:
function J = Jarc(In)
load D:\Documents\MATLAB\Traiettorie\SecondoTentativo\Variabili\optionsode.mat
load D:\Documents\MATLAB\Traiettorie\SecondoTentativo\Variabili\mi.mat
load D:\Documents\MATLAB\Traiettorie\SecondoTentativo\Variabili\beta.mat
load D:\Documents\MATLAB\Traiettorie\SecondoTentativo\Variabili\Rm.mat
load D:\Documents\MATLAB\Traiettorie\SecondoTentativo\Variabili\Rt.mat
%Pesi
A= 10000; %Raggio
B= 1000; %Radiale
C= 1000; %Tangenziale
[t1,X1]=ode45(@(t,A)eqni_archi(t,A,In(1),beta,mi), [0 In(4)*24*60*60] , [Rt, 0, 0, sqrt(mi/Rt)] ,optionsode);
[t2,X2]=ode45(@(t,A)eqni_archi(t,A,In(2),beta,mi), [0 In(5)*24*60*60] , X1(end,1:4) ,optionsode);
[t3,X3]=ode45(@(t,A)eqni_archi(t,A,In(3),beta,mi), [0 In(6)*24*60*60] , X2(end,1:4) ,optionsode);
J = (abs(In(4)+In(5)+In(6)))+A*abs(Rm-X3(end,1))/Rm+B*abs(sqrt(mi/Rm)-X3(end,4))/sqrt(mi/Rm)+C*abs(X3(end,3))/sqrt(mi/Rm);
Then there is a last external scripts to run the PSO, but it works i've tested it already.
I never did an ODE integration with additional input other then the variables. Running the "Jarc" function with In=[1,1,1,2,2,2] (that are not the wanted value but just a trial) lead to the error related to this rows:
[t1,X1]=ode45(@(t,A)eqni_archi(t,A,In(1),beta,mi), [0 In(4)*24*60*60] , [Rt, 0, 0, sqrt(mi/Rt)] ,optionsode);
[t2,X2]=ode45(@(t,A)eqni_archi(t,A,In(2),beta,mi), [0 In(5)*24*60*60] , X1(end,1:4) ,optionsode);
[t3,X3]=ode45(@(t,A)eqni_archi(t,A,In(3),beta,mi), [0 In(6)*24*60*60] , X2(end,1:4) ,optionsode);
Errors:
>>Jarc([1,1,1,2,2,2])
Not enough input arguments.
Error in beta (line 19)
y = exp(betaln(z,w));
Error in Jarc>@(t,A)eqni_archi(t,A,In(1),beta,mi) (line 16)
[t1,X1]=ode45(@(t,A)eqni_archi(t,A,In(1),beta,mi), [0 In(4)*24*60*60] , [Rt, 0, 0, sqrt(mi/Rt)] ,optionsode);
Error in odearguments (line 90)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ode45 (line 115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);
Error in Jarc (line 16)
[t1,X1]=ode45(@(t,A)eqni_archi(t,A,In(1),beta,mi), [0 In(4)*24*60*60] , [Rt, 0, 0, sqrt(mi/Rt)] ,optionsode);
I don't understand why, all the variables should be declared. Also alfa beta and mi are scalars while X is a 4 components vectors.
Thank you in advance.
  댓글 수: 2
Nicola Zappacosta
Nicola Zappacosta 2019년 11월 25일
I noticed that just by adding the rows:
beta=beta;
mi=mi;
the problem is solved, but i didn't get why. I saved the variables like:
mi = 89182 %not the real value of the problem
save mi
so i took them for all the files i have to write
darova
darova 2019년 11월 25일
What these lines mean?
Error in beta (line 19)
y = exp(betaln(z,w));

댓글을 달려면 로그인하십시오.

답변 (0개)

카테고리

Help CenterFile Exchange에서 Ordinary Differential Equations에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by