行列を計算して,代入​をしたいのですが,サ​イズが異なるためでき​ないといわれてしまい​ます.教えてください​.

22 views (last 30 days)
春希
春希 on 14 Nov 2024 at 10:00
Answered: 春希 on 20 Nov 2024 at 4:27
deltax = 10*(1000 /3600);
eya = Ya; eva = abs(va-V); eyTH = YTH;
eTHw = abs(THw-TH); eTHg = abs(THg-TH);
A = [1,deltaT,0,0,0;0,1,0,0,0;0,0,1,deltax,0;0,0,0,1,0;0,0,0,0,0];
B = [0,0,0,0,0;deltaT,0,0,0,0;0,0,0,0,0;0,deltaT,0,0,0;0,0,1,0,0];
C = [1,0,-1,0,0;0,0,0,1,-1];
X = [eya,eva,eyTH,eTHw,eTHg];
Q = 1.5*10^-6; R = 1.0*10^-7; U = 5.0*10^-3;
q = randn(N,1)*sqrtm(Q);
r = randn(N,1)*sqrtm(R);
u = randn(N,1)*sqrtm(U);
Z = [q;r;u;0;0];
x =[0,0,0,0,0];
for k=2:N
X (k,:) =A*X(k-1,:).'+B*Z(k-1,:).'; %個々の部分でエラーが出てしまします.
end

Answers (2)

Image Analyst
Image Analyst on 14 Nov 2024 at 15:30
If you have any more questions, then attach your data and code to read it in with the paperclip icon after you read this:
For example, you aren't telling us what Ya, va, V, etc. are Plus you are not giving us the full error message (ALL the red text) so we don't know what line the error occurs on.
Before the loop, have this
whos A
whos X
whos B
whos Z
But X(k-1,:).' is a row vector transposed so that it's now a column vector. But A is a 2-D matrix, so you're doing a matrix multiply, not an element-by-element multiply, So if A is rows x columns, then X(k-1,:).' better be columns x 1 or else it won't work as a matrix multiply. Did you intens an element-by-element multiply? If so use .* rather than *

春希
春希 on 20 Nov 2024 at 4:27
すいませんでした.プログラムの全文を改めて提示します.下記の内容がエラー文として表示されました.
dataは実験でのデータファイルで,Excelファイルを添付しました.
「左辺のサイズが 1x5 で右辺のサイズが 5x5 であるため、代入を実行できません。
エラー: kalmanf (行 92)
X(k,:) =A*X(k-1,:)'+B*Z(k-1,:)';
^^^^^^                                   」
%重力加速度
g = 9.81;
%自転車前後輪位置間隔
L = 1.2;
%ホルダと前輪位置の間隔
d = 0.13;
%自転車ホルダ位置の角度θ
TH = 50;
%走行速度(km/h)
v = 4;
%走行速度(m/s)
V = v* (1000 / 3600 );
%Excelからのデータを数値行列にしてインポートする
DATA = test1;
time = DATA(:,1);
Ax = DATA(:,2);
Ay = DATA(:,3);
Az = DATA(:,4);
Ao = DATA(:,5);
Axp= DATA(:,6);
Ayp= DATA(:,7);
Azp= DATA(:,8);
Aop= DATA(:,9);
%データ数
N = numel(time);
%時間間隔
deltaT = abs(sum(diff(time)))/N;
%各時間に進んだ距離
x = V *deltaT;
%路面プロファイルya用の各時間に進んだ距離の行列
matx1 = V*time;
%路面プロファイルyθ用の各時間に進んだ距離の行列
matx2 = V*time;
%角速度と時間間隔の積
THw = Aop * deltaT;
%推定姿勢角
THwsum = sum(THw);
%Axの最初5個と最後5個の要素を0にする
for K =1:5
Ay(K,:) = 0;
end
for kse =N-5:N
Ay(kse,:) = 0;
end
%重力加速度に由来する比較的長周期の成分を抽出
Aysum = sum(Ay);
%傾斜角
THg =atan(Ay/g);
THgsum = sum(THg);
%鉛直加速度からgを取り除いた動的成分
ay = ((L - d) * Az + d * (Az*(x-L))/L);
%鉛直成分の速度
va = (1/2) * Azp * deltaT;
vasum = sum(va);
%路面プロファイルya
Ya =(1/4) * abs(Ayp) * deltaT^2;
Yasum = sum(Ya);
%推定自転車姿勢角と各時間に進んだ距離からの路面プロファイルyθ
YTH =x*sin(THw);
YTHsum = sum(YTH);
%路面プロファイルyθのグラフ
figure(1),clf
plot(matx2,YTH);
title('自転車姿勢角と各時間に進んだ距離による路面プロファイル')
xlabel('距離(m)');
ylabel('路面の凹凸(cm)');
%路面プロファイルyaのグラフ
figure(2),clf
plot(matx1,Ya);
title('鉛直加速度による路面プロファイル');
xlabel('距離(m)');
ylabel('路面の凹凸(cm)');
deltax = 10*(1000 /3600);
A = [1,deltaT,0,0,0;0,1,0,0,0;0,0,1,deltax,0;0,0,0,1,0;0,0,0,0,0];
B = [0,0,0,0,0;deltaT,0,0,0,0;0,0,0,0,0;0,deltaT,0,0,0;0,0,1,0,0];
C = [1,0,-1,0,0;0,0,0,1,-1];
Q = 1.5*10^-6; R = 1.0*10^-7; U = 5.0*10^-3;
q = randn(N,1)*sqrtm(Q);
r = randn(N,1)*sqrtm(R);
u = randn(N,1)*sqrtm(U);
Z = [q;r;u;0;0];
X = zeros(N,5);
X(1,:) = [0;0;0;0;0];
for k=2:N
X(k,:) =A*X(k-1,:)'+B*Z(k-1,:)';
end
e1 = X(:,1) + X(:,2);
e2 = X(:,3) + X(:,4);
y1 = z + e1;
y2 = z + e2;
fs = 1;
m = length(e1);
n = pow2(nextpow2(m));
f = (0:n-1)*(fs/n);
ye1 = fft(e1,n);
ye2 = fft(e2,n);
xhat_ukf = zeros(N,5);
xhat = zeros(N,5);
xhat(1,:) = X(1,:)' + [10;10;20];
p = 1000*eye(3);
for k =2:N
[xhat(k,:),p] = kf(A,B,0,C,Q,R,0,y(k),xhat(k-1,:),p);
end
Yhata = Y1 - Y2;
error = xhat-X;
function [xhat_new,p_new, G] = kf(A,B,Bu,C,Q,R,u,y,xhat,p)
xhat =xhat(:); u =u(:); y=y(:);
xhatm = A*xhat + Bu*u;
pm = A*p*A' + B*Q*B';
G = pm*C/(C'*pm*C+R);
xhat_new = xhatm + G*(y-C'*xhatm);
p_new = (eye(size(A))-G*C')*pm;
end
figure(3), clf

Categories

Find more on Creating and Concatenating Matrices 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!