このエラーの解決方法について、時間 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
Categories
Find more on 誤りの検出と訂正 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!