このエラーの解決方法について、時間 0.0 における状態 '1' の導関数が有限ではあ​りません。シミュレー​ションを停止します。​解に特異点が存在する​可能性があります。そ​うでない場合は、(固​定ステップ サイズを小さくする、​または許容誤差を厳し​くすることによって) ステップ サイズを減らしてみてください

111 views (last 30 days)
Taiki Oyama
Taiki Oyama on 25 Dec 2022
Answered: covao on 3 Apr 2023
エラーの詳細です。
警告: 行列は特異行列、特異行列に近い、または正しくスケーリングされていません。結果は不正確になる可能性があります。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;

Answers (1)

covao
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')
Warning: An error occurred while evaluating "loc_createToolchain" in "/MATLAB/toolbox/coder/autosar/rtwTargetInfo.p": Unrecognized function or variable 'autosarroot'.
This custom registration is not loaded.
Warning: Matching "From" for "Goto" 'soturon_2/Goto11' not found
Warning: Matrix is singular, close to singular or badly scaled. Results may be inaccurate. RCOND = NaN.
Warning: Matrix is singular, close to singular or badly scaled. Results may be inaccurate. RCOND = NaN.
Derivative of state '1' in block 'soturon_2/Integrator8' at time 0.0 is not finite. The simulation will be stopped. There may be a singularity in the solution. If not, try reducing the step size (either by reducing the fixed step size or by tightening the error tolerances)

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!