История изменений
Исправление amaora, (текущая версия) :
Да действительно.
X : [id, iq, th, wR, M, E];
dF : [ (Ux*cos(th)+Uy*sin(th) - id*R + wR*iq*Lq) / Ld,
(Uy*cos(th)-Ux*sin(th) - iq*R - wR*id*Ld - wR*E) / Lq,
wR,
Zp * (1.5*Zp*iq*(E - (Lq - Ld)*id) - M) / J,
0,
0];
F : X + dF * dT;
A : jacobian(F, X);
fortran(A);
Выдает.
A(1,1) = 1-dT*R/Ld
A(1,2) = Lq*dT*wR/Ld
A(1,3) = (cos(th)*Uy-sin(th)*Ux)*dT/Ld
A(1,4) = iq*Lq*dT/Ld
A(1,5) = 0
A(1,6) = 0
A(2,1) = -Ld*dT*wR/Lq
A(2,2) = 1-dT*R/Lq
A(2,3) = (-sin(th)*Uy-cos(th)*Ux)*dT/Lq
A(2,4) = dT*(-E-id*Ld)/Lq
A(2,5) = 0
A(2,6) = -dT*wR/Lq
A(3,1) = 0
A(3,2) = 0
A(3,3) = 1
A(3,4) = dT
A(3,5) = 0
A(3,6) = 0
A(4,1) = 1.4999999999999997d+0*iq*(Ld-Lq)*Zp**2*dT/J
A(4,2) = 1.4999999999999997d+0*Zp**2*dT*(E-id*(Lq-Ld))/J
A(4,3) = 0
A(4,4) = 1
A(4,5) = -Zp*dT/J
A(4,6) = 1.4999999999999997d+0*iq*Zp**2*dT/J
A(5,1) = 0
A(5,2) = 0
A(5,3) = 0
A(5,4) = 0
A(5,5) = 1
A(5,6) = 0
A(6,1) = 0
A(6,2) = 0
A(6,3) = 0
A(6,4) = 0
A(6,5) = 0
A(6,6) = 1
Но это не C и если сделать сначала optimize(A) то генератор зафейлится. Да и без оптимизации, если добавить умножение матриц, тоже вывод непригоден для использования (некорректный вывод длинных строк).
P : matrix( [p0, p1, p3, p6, p10, p15],
[p1, p2, p4, p7, p11, p16],
[p3, p4, p5, p8, p12, p17],
[p6, p7, p8, p9, p13, p18],
[p10, p11, p12, p13, p14, p19],
[p15, p16, p17, p18, p19, p20]);
Pk : A . P . transpose(A);
fortran(Pk);
Хотя вот optimize(Pk) выдает неплохой результат, на первый взгляд. Еще бы на C его транслировать.
Исходная версия amaora, :
Да действительно.
X : [id, iq, th, wR, M, E];
dF : [ (Ux*cos(th)+Uy*sin(th) - id*R + wR*iq*Lq) / Ld,
(Uy*cos(th)-Ux*sin(th) - iq*R - wR*id*Ld - wR*E) / Lq,
wR,
Zp * (1.5*Zp*iq*(E - (Lq - Ld)*id) - M) / J,
0,
0];
F : X + dF * dT;
A : jacobian(F, X);
fortran(A);
Выдает.
A(1,1) = 1-dT*R/Ld
A(1,2) = Lq*dT*wR/Ld
A(1,3) = (cos(th)*Uy-sin(th)*Ux)*dT/Ld
A(1,4) = iq*Lq*dT/Ld
A(1,5) = 0
A(1,6) = 0
A(2,1) = -Ld*dT*wR/Lq
A(2,2) = 1-dT*R/Lq
A(2,3) = (-sin(th)*Uy-cos(th)*Ux)*dT/Lq
A(2,4) = dT*(-E-id*Ld)/Lq
A(2,5) = 0
A(2,6) = -dT*wR/Lq
A(3,1) = 0
A(3,2) = 0
A(3,3) = 1
A(3,4) = dT
A(3,5) = 0
A(3,6) = 0
A(4,1) = 1.4999999999999997d+0*iq*(Ld-Lq)*Zp**2*dT/J
A(4,2) = 1.4999999999999997d+0*Zp**2*dT*(E-id*(Lq-Ld))/J
A(4,3) = 0
A(4,4) = 1
A(4,5) = -Zp*dT/J
A(4,6) = 1.4999999999999997d+0*iq*Zp**2*dT/J
A(5,1) = 0
A(5,2) = 0
A(5,3) = 0
A(5,4) = 0
A(5,5) = 1
A(5,6) = 0
A(6,1) = 0
A(6,2) = 0
A(6,3) = 0
A(6,4) = 0
A(6,5) = 0
A(6,6) = 1
Но это не C и если сделать сначала optimize(A) то генератор зафейлится. Да и без оптимизации, если добавить умножение матриц, тоже вывод непригоден для использования (некорректный вывод длинных строк).
P : matrix( [p0, p1, p3, p6, p10, p15],
[p1, p2, p4, p7, p11, p16],
[p3, p4, p5, p8, p12, p17],
[p6, p7, p8, p9, p13, p18],
[p10, p11, p12, p13, p14, p19],
[p21, p22, p23, p24, p25, p26]);
Pk : A . P . transpose(A);
fortran(Pk);
Хотя вот optimize(Pk) выдает неплохой результат, на первый взгляд. Еще бы на C его транслировать.