我尝试使用 ode45 模拟系统。
我尝试了两种运行时间非常不同的策略。
首先,我声明必要的变量,并在 ode 解决的函数内分配它的值:
function dy = Fun2_004(t,y,frequency)
dy=zeros(11,1)
%Initialization of variables
K_t=.559;
f_Theta=.002;
J=5e-7;
K_Theta=9.45e-4;
.
.
.
%equations
dy=...
end
[T2,Y2] = ode45(@(t,y)Fun2_004(t,y,Omega_Hertz),[0 Time],Inits,options);
此代码需要0.5秒才能执行。
我想在优化过程中使用此代码,因此我将其作为此函数的参数传递:
function dy = Fun2_004_PSO(t,y,frequency,InputVars)
dy=zeros(11,1)
%Initialization of variables
K_t=InputVars(1);
f_Theta=InputVars(2);
J=InputVars(3);
K_Theta=InputVars(4);
.
.
.
%equations
dy=...
end`
[T2,Y2] = ode45(@(t,y)Fun2_004_PSO(t,y,Omega_Hertz,InputVars),[0 Time],Inits,options);
此代码需要40秒才能执行!!!
我尝试了全局变量, codegen 和持久性变量但它没有相当大的影响。
是否有任何机构确切知道此问题的来源和解决方案?
将帖子 在这里,我带了一部分代码和更多细节
>`function [dy] = Fun2_EHSV_004_PSO(t,y,Omega,InputVars)
dy = zeros(7,1);
K_t=InputVars(9);%K_t=.559;
K_T=InputVars(11);%K_T=10.8;
L_f=InputVars(1);%L_f=9e-3;
L_s=InputVars(2);%L_s=30e-3;
d_f=InputVars(3);%d_f=0.5e-3;
d_5=InputVars(5);%d_5=0.6e-3;
d_s=InputVars(4);%d_s=4.6e-3;
w=InputVars(8);%w=.01446;
c=InputVars(6);%c=2e-6;
f_s=InputVars(7);%f_s=3.035;
K_s=InputVars(10);%K_s=900;
%%
f_Theta=.002;
J=5e-7;
K_Theta=9.45e-4;
K_FB=.04;
x_i=30e-6;
R_s=5000;
K_Lf=5e6;
Rhuo=867;
B=1.5e9;
V_0=2e-6;
V_3=5e-6;
m_s=0.02;
P_s=250e5;
P_T=0;
%
A_0=0.25*pi*(5e-4)^2;
A_s=0.25*pi*d_s^2;
A_5=0.25*pi*d_5^2;
C_d=0.661;
C_c=1e1;
%
i_e = .01*sind(Omega*t);
%%
T=K_t*i_e+K_Theta*y(1);
F_s=K_s*(L_s*y(1)+y(6));
x_f=L_f*y(1);
C_12=C_d*A_0*sqrt(2/Rhuo);
C_34=C_d*pi*d_f*sqrt(2/Rhuo);
C_5=C_d*A_5*sqrt(2/Rhuo);
%%
dy(1) = y(2);
dy(2) = (1/J)*(T-K_T*y(1)-f_Theta*y(2));
dy(3) = (C_12*sqrt(P_s-y(3))-C_34*(x_i+x_f)*sqrt(y(3)-y(5))+A_s*y(7))/((V_0- A_s*y(6))/B);
dy(4) = (C_12*sqrt(P_s-y(4))-C_34*(x_i-x_f)*sqrt(y(4)-y(5))- A_s*y(7))/((V_0+A_s*y(6))/B);
dy(5) = (C_34*(x_i+x_f)*sqrt(y(3)-y(5))+C_34*(x_i-x_f)*sqrt(y(4)-y(5))- C_5*sqrt(y(5)-P_T))/(V_3/B);
dy(6) = y(7); F_j=0;%F_s=0;
dy(7) = (A_s*(y(4)-y(3))-f_s*y(7)-F_j-F_s)/m_s;`
[T2,Y2] = ode45(@(t,y)Fun2_test(t,y,Omega,In),[0 .37],[0 0 100e5 100e5 100e5 0 0]);