Оптимизация по быстродействию и по расходу электроэнергии

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

µт количеству неизвестных системы.

Решаемая система уравнений указана в М-функции Nekit_func2, записанной в одноименном М-файле Nekit_func2.m. Текст функции Nekit_func2:

function F = Nekit_func2(X)=exp(-0.5*X(1)).*(-1.7*cos(3.12*X(1))-0.272*sin(3.12*X(1)))+1;=5.44*exp(-0.5*X(1)).*sin(3.12*X(1));=exp(0.5*X(2)).*(1.4*cos(3.12*X(2))-0.224*sin(3.12*X(2)))-1;=4.48*exp(0.5*X(2)).*sin(3.12*X(2));= 0.7;

w1k = 0.4;= [ X(3)-x21;-X(3);+(tk-X(1)-X(2))*X(3)+x12-w1k];

Здесь x11 и x21 - функции x1(t) и x2(t) на первом интервале управления

x12 и x22 - функции x1(t) и x2(t) на втором интервале управления

tk - общая длительность оптимального управления

w1k - конечная координата регулирования

Х(1), Х(2) - соответственно первый и третий интервалы времени, записываемые в элементы матрицы X; индексы матрицы указываются в скобках.

Х(3) - коэффициент x2C, записываемый в матрицу X.

В результате выполнения функции fsolve() вида (2.16) получен следующий результат: Х(1) = 0.2505, Х(2) = 0.1996 и X(3) = -0.3273.

Это значит, что t1 = 0.2505, t3 = 0.1996 и x = -0.3273. Для tk = 2.86 значение второго интервала составит t2 = tk - t1 - t3 = 2.41.

3. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ РАСЧЕТА ЗАКОНА УПРАВЛЕНИЯ, ОПТИМАЛЬНОГО ПО БЫСТРОДЕЙСТВИЮ

 

Программа расчета параметров оптимального по быстродействию закона управления написана на языке высокого уровня C++ и ориентирована на оба варианта, как на вариант с вещественными корнями характеристического уравнения, так и с комплексными. Система вывода информации предусматривает расчет коэффициентов и сохранение точек графика пространства состояний в файл для дальнейшего его отображения посредством MS Excel.

Текст программы:

#include

#include

#include

#define EPS 0.005

#define SIZE_ARRAY 50000

#define TBEG 0.;

#define DT 0.001

// sqrt uravneniesqrtUr (double, double, double, double *, double *, double *, double *);main ()

{*fil;buf[256];a2, a1, y0, yk;a0 = 1;k = 1;f;("Vvedite Bm = ");("%lf", &a2);= a2;("Vvedite W0 = ");("%lf", &y0);("Vvedite Wk = ");("%lf", &yk);x10, x20;c1, c2, c3, c4;

/*korni harateristicheskogo uravneniya */la1, la2, lai1, lai2; /* lyambda - 1 uchastok- 2 uchastok*/*x1a, *x2a, *x1b, *x2b;a = new double [SIZE_ARRAY];a = new double [SIZE_ARRAY];b = new double [SIZE_ARRAY];b = new double [SIZE_ARRAY];t0 = TBEG;t;dt = DT;i, j, n, na, nb;maxa, maxb;

/* korni harakteristicheskogo uravneniya */= sqrtUr(a2, a1, a0, &la1, &la2, &lai1, &lai2);(1 == i) /* korni rationalnie*/

{("Korni rationalnie:\n\n");("Harakteristicheskoe uravnenie:\n");(" %.2lf *la^2 + %.2lf *la + 1 = 0\n", a2, a1);(" la1 = %.3lf;\n", la1); (" la2 = %.3lf;\n", la2); ("\n");

/* 1 interval */("1 interval:\n");= y0;= 0;("x10 = y0 = %.3lf;\n", y0);("x20 = 0;\n\n");= (la2 * (x10 - 1) - x20) / (la2 - la1);= -(la1 * (x10 - 1) - x20) / (la2 - la1);(" c1 = %.3lf;\n", c1); (" c2 = %.3lf;\n", c2); ("\n");(" x1 = %6.3lf * exp(%6.3lf * t) + %6.3lf * exp(%6.3lf * t) + 1;\n",, la1, c2, la2); (" x2 = %6.3lf * (exp(%6.3lf * t) - exp(%6.3lf * t));\n",*la1, la1, la2); ("\n");

/* 2 interval */= yk;= 0;("2 interval:\n");("x10 = yk = %.3lf;\n", yk);("x20 = 0;\n\n");= (la2 * (x10 + 1) - x20) / (la2 - la1);= -(la1 * (x10 + 1) - x20) / (la2 - la1);(" c3 = %.3lf;\n", c3); (" c4 = %.3lf;\n", c4); ("\n");(" x1 = %6.3lf * exp(%6.3lf * t) + %6.3lf * exp(%6.3lf * t) - 1;\n",, -la1, c4, -la2); (" x2 = %6.3lf * exp(%6.3lf * t) + %6.3lf * exp(%6.3lf * t);\n",*la1, -la1, c4*la2, -la2); ("\n");

/* count points */= SIZE_ARRAY;= t0;= 0;= 0;(i=0; i<n; i++)

{a[i] = c1 * exp(la1 * t) + c2 * exp(la2 * t) + 1;a[i] = c1 * la1 * exp(la1 * t) + c2 * la2 * exp(la2 * t);b[i] = c3 * exp(-la1 * t) + c4 * exp(-la2 * t) - 1;b[i] = c3 * la1 * exp(-la1 * t) + c4 * la2 * exp(-la2 * t);= (x2a[i] > maxa) ? x2a[i] : maxa;= (x2b[i] > maxb) ? x2b[i] : maxb;+= dt;

}

/* test max N */(i=0; i<n; i++)

{((x1a[i] <= x1b[0])&&(x2a[i] <= maxb))

{= i;

}((x1b[i] >= x1a[0])&&(x2b[i] <= maxa))

{= i;

}

}++;++;("n = %d\n", n);("na = %d\n", na);("nb = %d\n", nb);("\n");

/* save points */= fopen ("points.txt", "w");(&buf[0], "t0= %.3lf\n", t0);(&buf[0], fil);(&buf[0], "dt= %.3lf\n", dt);(&buf[0], fil);(&buf[0], " i t x1a x2a x1b x2b\n", dt);(&buf[0], fil);(i=0; i<n; i++)

{= dt * i;(&buf[0], " %.3lf", i, t);(&buf[0], fil);( i<= na)

{(&buf[0], " %.3lf %.3lf", x1a[i], x2a[i]);(&buf[0], fil);

}

{(" - -", fil);

}( i<= nb)

{(&buf[0], " %.3lf %.3lf", x1b[i], x2b[i]);(&buf[0], fil);

}("\n", fil);

}(fil);

/* look for point */(j=0; j<nb; j++)

{(i=0; i<na; i++)

{((fabs(x1a[i] - x1b[j])<EPS)&&(fabs(x2a[i] - x2b[j])<EPS))

{= true;;

}

}(f == true) break;

}("A [%.3lf, %.3lf] t = %.3lf;\n", i, x1a[i], x2a[i], i*dt); ("B [%.3lf, %.3lf] t = %.3lf;\n", j, x1b[j], x2b[j], j*dt);

}if (2 == i) /* irracionalnie */

 

/* second variant */

{("Korni irrationalnie:\n\n");("Harakteristicheskoe uravnenie:\n");(" %.2lf *la^2 + %.2lf *la + 1 = 0\n", a2, a1);(" la1 = %.3lf + %.3lfi;\n", la1, lai1); (" la2 = %.3lf - %.3lfi;\n", la1, lai1); ("\n");

/* 1 interval */("1 interval:\n");= y0;= 0;("x10 = y0 = %.3lf;\n", x10);("x20 = 0;\n\n");= x10+1;= (x20-(la1)*(x10+1))/lai1;(" c1 = x10 + 1 = %.3lf\n", c1);(" c2 = (x20-(-0.5)*(x1+1))/0.5 = %.3lf\n", c2);("x1 = exp(%.3lf*t) * (%.3lfcos%.3lft + %.3lfsin%.3lft) + 1\n",, c1, lai1, c2, lai1);("x2 = exp(%.3lf*t) * (%.3lfcos%.3lft + %.3lfsin%.3lft)\n", , la1*c1+lai1*c2, lai1, -lai1*c1+la1*c2, lai1);("\n");

/* 2 interval */("2 interval:\n");= yk;= 0;("x10 = yk = %.3lf;\n", x10);("x20 = 0;\n\n");= x10-1;= (x20-(la1)*(x10-1))/lai1;(" c3 = x10 - 1 = %.3lf\n", c3);(" c4 = (x20-(-0.5)*(x10-1))/0.5 = %.3lf\n", c4);("x1 = exp(%.3lf*t) * (%.3lfcos%.3lft + %.3lfsin%.3lft) - 1\n",

la1, c3, lai1, -c4, lai1);("x2 = exp(%.3lf*t) * (%.3lfcos%.3lft + %.3lfsin%.3lft)\n",

la1, la1*c3+lai1*c4, lai1, -(-lai1*c3+la1*c4), lai1);

/* raschet tochek */= SIZE_ARRAY;= t0;= 0;= 0;(i=0; i<n; i++)

{a[i] = exp(la1*t)*(c1*cos(la1*t)+c2*sin(la1*t)) + 1;a[i] = exp(la1*t)*

((la1*c1+lai1*c2)*cos(lai1*t)+

(-lai1*c1+la1*c2)*sin((lai1*t)));b[i] = exp(-la1*t)*(c3*cos(la1*t)-c4*sin(la1*t)) - 1;b[i] = exp(-la1*t)*

((la1*c3+lai1*c4)*cos(lai1*t)+

(-lai1*c3+la1*c4)*sin((-lai1*t)));= (x2a[i] > maxa) ? x2a[i] : maxa;= (x2b[i] > maxb) ? x2b[i] : maxb;+= dt;

}

/* test max N */(i=0; i<n; i++)

{(/*(x1a[i] <= x1b[0])&&*/(x2a[i] <= maxb))

{= i;

}(/*(x1b[i] >= x1a[0])&&*/(x2b[i] <= maxa))

{= i;

}

}

/* save points */= fopen ("points.txt", "w");(&buf[0], "t0= %.3lf\n", t0);(&buf[0], fil);(&buf[0], "dt= %.3lf\n", dt);(&buf[0], fil);(&buf[0], " i t x1a x2a x1b x2b\n", dt);(&buf[0], fil);(i=0; i<n; i++)

{= dt * i;(&buf[0], " %.3lf", i, t);(&buf[0], fil);( i<= na)

{(&buf[0], " %.3lf %.3lf", x1a[i], x2a[i]);(&buf[0], fil);

}

{(" - -", fil);

}( i<= nb)

{(&buf[0], " %.3lf %.3lf", x1b[i], x2b[i]);(&buf[0], fil);

}("\n", fil);

}(fil);

/* poisk peresechenie */(j=0; j<nb; j++)

{(i=0; i<na; i++)

{((fabs(x1a[i] - x1b[j])<EPS)&&(fabs(x2a[i] - x2b[j])<EPS))

{= true;;

}

}(f == true) break;

}("