このエラーの解決方法について、時間 0.0 における状態 '1' の導関数が有限ではありません。シミュレーションを停止します。解に特異点が存在する可能性があります。そうでない場合は、(固定ステップ サイズを小さくする、または許容誤差を厳しくすることによって) ステップ サイズを減らしてみてください
111 views (last 30 days)
Show older comments
エラーの詳細です。
警告: 行列は特異行列、特異行列に近い、または正しくスケーリングされていません。結果は不正確になる可能性があります。RCOND = NaN。 警告: 行列は特異行列、特異行列に近い、または正しくスケーリングされていません。結果は不正確になる可能性があります。RCOND = NaN。
シミュレーションの実行中にエラーが発生したため、シミュレーションを終了しました
原因:
- ブロック 'soturon_2/Integrator8' の時間 0.0 における状態 '1' の導関数が有限ではありません。シミュレーションを停止します。解に特異点が存在する可能性があります。そうでない場合は、(固定ステップ サイズを小さくする、または許容誤差を厳しくすることによって) ステップ サイズを減らしてみてください
mファイルです。
clc
clear
Ts=0.0001;
T=0.1;
m=1740;
ig=3214;
kf=60000;
kr=122000;
lf=1.4;
lr=1.414;
lg=0.342;
vx=80/3.6; %/ m/s
x0=[0 0 0 0 0 0];
xv0=[0 0 0 0 0 0];
xrou_0=[0;0];
xq_0=[0; 0; 0; xrou_0(1); vx*xrou_0(1); xrou_0(2)];
w=3.5;
x=50;
r=(1/3.5)*(x^2+(3.5/2)^2);
C=2*asin(((2*x)^2+(3.5)^2)^(1/2)/(4*r)); %/ θ=c
K=r*C; %/ 弧の長さ(目標軌道の半分)
rou1=1/r;
rou2=-1/r;
t_c1=1;
t_c2=t_c1+(K/vx);
t_c3=2*t_c2-t_c1;
yr_0=0;
da=0.001;
b=[0 ; 1];
b_=b';
c=[1 ; 0];
theta=1;
omega_n=10;
Er_0=0;
I=diag([1 1]);
Iv=diag([1 1 1 1 1 1]);
I2=diag([1 1]);
O2=diag([0 0]);
Mp=diag([m ig]);
H=[1 1 ;lf lg];
H_=H';
ku=diag([kf kr]);
omega_lg=I+lg*c*b';
M=inv(omega_lg)*Mp*omega_lg;
Bpu=inv(M)*H*ku;
Bpu_=Bpu';
Bpu_gyaku=inv(Bpu);
A32=(1/vx)*Bpu*H'*(vx*c*b'-da*I2);
A33=-((1/vx)*Bpu*transpose(H)+da*I2);
Bu=[O2 ; O2 ; I2];
Bu_=[O2 O2 I2];
Bp=Bu*Bpu;
Arou=[0 1 ;-omega_n^2 -2*theta*omega_n ];
brou=[0 ; 1 ; 0 ; 0 ; 0; 0];
Ap=[vx*c*b' I2 O2 ;
O2 -vx*c*b' I2 ;
O2 A32 A33];
By=[O2; I2; O2];
By_=By';
Bua=H'*[(-(da/vx)*I+c*b')*By'-Bu'/vx];
betax=1;
bv=[0;0;1];
Av_beta=[0 1 0; 0 0 1; -1 -3 -3];
Bry=[1 0; 0 1; 1 0; 0 1; 0 0; 0 0];
Bry_=Bry';
Br=[I2; O2; O2];
Br_=Br';
vxc=80;
vx_dot=0;
R=diag([0.1 0.1]);
Q=diag([1 1 1 1 100 1]);
Q=diag([1 1 1 1 100 1]);
[P1,l,g]=care(Ap,Bp,Q,R);
F1=inv(R)*Bp'*P1;
R2=diag([0.1 0.1]);
Q2=diag([1 1 1 1 100 1]);
[P2,l,g]=care(Ap,Bp,Q2,R2);
F2=inv(R2)*Bp'*P2;
こちらがmatlab function のコードです。
function [Tv,Tv_inv,Tv_dot, Cv, Cv_inv,Ap_vx_hat] = fcn(vx_hat, vx_hat_dot,vx_hat_2dot,vx_hat_3dot, vxc)
Tv=[1 0 0 0 0 0; 0 vx_hat_dot/vxc 0 0 0 0; 0 0 1 0 0 0; 0 vx_hat_dot/vxc 0 vx_hat_dot/vxc 0 0; 0 vx_hat_dot 0 0 1 0; 0 vx_hat_2dot/vxc 0 2*vx_hat_dot/vxc 0 vx_hat_dot/vxc];
Cv=[1 0; 0 vx_hat_dot/vxc ];
Tv_inv=inv(Tv);
Cv_inv=inv(Cv);
Tv_dot=[0 0 0 0 0 0; 0 vx_hat_2dot/vxc 0 0 0 0; 0 0 0 0 0 0; 0 vx_hat_2dot/vxc 0 vx_hat_2dot/vxc 0 0; 0 vx_hat_2dot 0 0 0 0; 0 vx_hat_3dot/vxc 0 2*vx_hat_2dot/vxc 0 vx_hat_2dot/vxc];
da=0.001;
b=[0 ; 1];
b_=b';
c=[1 ; 0];
I=diag([1 1]);
I2=diag([1 1]);
O2=diag([0 0]);
lf=1.4;
lg=0.342;
m=1740;
ig=3214;
kf=60000;
kr=122000;
H=[1 1 ;lf lg];
H_=H';
Mp=diag([m ig]);
ku=diag([kf kr]);
omega_lg=I+lg*c*b_;
M=inv(omega_lg)*Mp*omega_lg;
Bpu=inv(M)*H*ku;
Ap_vx_hat=[ vx_hat*c*b_ I2 O2 ;O2 -vx_hat*c*b_ I2 ; O2 Bpu*H_*((vx_hat_dot/(vx_hat)^2)*I-(da/vx_hat)*I+c*b_) -(Bpu*H_)/vx_hat-da*I];
y = Tv;
0 Comments
Answers (1)
covao
on 3 Apr 2023
モデルにより対策方法は様々ですが、ステップ サイズや許容誤差を変更する他、ソルバーの固定ステップ / 可変ステップの変更、可変ステップの場合、ソルバーの種類をode15s,ode23sなどStiffなソルバーに変えてトライしてみる方法が考えられます。
下記ドキュメントにソルバーの情報があります。
それでも、エラーが解消しない場合、モデルやパラメータ条件の見直しが必要です。
類似のエラー事例は、MATLAB Answersに多数あります。
clc
clear
Ts=0.0001;
T=0.1;
m=1740;
ig=3214;
kf=60000;
kr=122000;
lf=1.4;
lr=1.414;
lg=0.342;
vx=80/3.6; %/ m/s
x0=[0 0 0 0 0 0];
xv0=[0 0 0 0 0 0];
xrou_0=[0;0];
xq_0=[0; 0; 0; xrou_0(1); vx*xrou_0(1); xrou_0(2)];
w=3.5;
x=50;
r=(1/3.5)*(x^2+(3.5/2)^2);
C=2*asin(((2*x)^2+(3.5)^2)^(1/2)/(4*r)); %/ θ=c
K=r*C; %/ 弧の長さ(目標軌道の半分)
rou1=1/r;
rou2=-1/r;
t_c1=1;
t_c2=t_c1+(K/vx);
t_c3=2*t_c2-t_c1;
yr_0=0;
da=0.001;
b=[0 ; 1];
b_=b';
c=[1 ; 0];
theta=1;
omega_n=10;
Er_0=0;
I=diag([1 1]);
Iv=diag([1 1 1 1 1 1]);
I2=diag([1 1]);
O2=diag([0 0]);
Mp=diag([m ig]);
H=[1 1 ;lf lg];
H_=H';
Ku=diag([kf kr]);
omega_lg=I+lg*c*b';
M=inv(omega_lg)*Mp*omega_lg;
Bpu=inv(M)*H*Ku;
Bpu_=Bpu';
Bpu_gyaku=inv(Bpu);
A32=(1/vx)*Bpu*H'*(vx*c*b'-da*I2);
A33=-((1/vx)*Bpu*transpose(H)+da*I2);
Bu=[O2 ; O2 ; I2];
Bu_=[O2 O2 I2];
Bp=Bu*Bpu;
Arou=[0 1 ;-omega_n^2 -2*theta*omega_n ];
brou=[0 ; 1 ; 0 ; 0 ; 0; 0];
Ap=[vx*c*b' I2 O2 ;
O2 -vx*c*b' I2 ;
O2 A32 A33];
By=[O2; I2; O2];
By_=By';
Bua=H'*[(-(da/vx)*I+c*b')*By'-Bu'/vx];
betax=1;
bv=[0;0;1];
Av_beta=[0 1 0; 0 0 1; -1 -3 -3];
Bry=[1 0; 0 1; 1 0; 0 1; 0 0; 0 0];
Bry_=Bry';
Br=[I2; O2; O2];
Br_=Br';
vxc=80;
vx_dot=0;
R=diag([0.1 0.1]);
Q=diag([1 1 1 1 100 1]);
Q=diag([1 1 1 1 100 1]);
[P1,l,g]=care(Ap,Bp,Q,R);
F1=inv(R)*Bp'*P1;
R2=diag([0.1 0.1]);
Q2=diag([1 1 1 1 100 1]);
[P2,l,g]=icare(Ap,Bp,Q2,R2);
F2=inv(R2)*Bp'*P2;
websave('soturon_2.slx', 'https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1242312/soturon_2.slx');
open_system('soturon_2.slx')
%set_param(bdroot,'SolverType','Variable-Step');%Try changing 'Variable-Step' or 'Fixed-Step'
%set_param(bdroot,'Solver', 'ode15s'); %Try changing solver for Variable-Step
%set_param(bdroot,'Solver', 'ode14x'); %Try changing solver for Fixed-Step
sim('soturon_2')
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!