LINUX.ORG.RU

История изменений

Исправление 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 его транслировать.