Расчет и оптимизация электрической цепи

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Курсовая работа

«Расчет и оптимизация электрической цепи»

Новокузнецк, 2010

Введение

Целью данной работы является математическое моделирование электрической схемы, расчет этой схемы и оптимизация. Оптимизация заключается в нахождении таких значений заданных элементов оптимизации, чтобы функция изменения напряжения во времени стала близка к идеальной.

Для простоты оптимизации вводится целевая функция, которая по сути является суммой квадратов разностей идеальной и оптимизируемой функций в моменты времени, определяемые частотой дискретизации и временем окончания дискретизации.

Задачи

Для заданной схемы электрической цепи (рис. 1) необходимо:

1) Рассчитать электрическую цепь:

a) Найти значение токов во всех ветвях.

b) Найти напряжение на нагрузке Q элементов, где Q — L2, C3.

2) Оптимизировать схему, варьируя параметрами R3 и C2, чтобы напряжение на нагрузке u*H(t)=15*sin (w*t+2р/3). Время для произведения задачи оптимизации выбрать 1 мин с начала функционирования электрической схемы, время дискретизации 0,1 с.

Метод многомерной оптимизации: метод покоординатного спуска.

Метод одномерной оптимизации: метод простого перебора.

Исходные данные:

1. Идеальный источник напряжения:

u (t)=100*sin (wt), f=50Гц;

2. Элементы с постоянными характеристиками:

а) Резисторы:

R1=500 Ом, R2=1000 Ом, R4=100 Ом;

б) Конденсаторы:

С1=100 мкФ, С 3=200 мкФ;

в) Катушки индуктивности:

L1=1 мГн, L2=5 мГн;

3. Элементы с переменными характеристиками:

а) R3=[100 Омч1000 Ом], R3ном=500 Ом;

б) С2=[20 мкФч100 мкФ], С2ном=50 мкФ;

1. Расчет электрической цепи

1. 1 Ручной расчет

Найдем сопротивления элементов и ветвей:

По первому и второму закону Кирхгофа получаем систему:

Приведем подобные и подставим известные значения:

Упростим систему, используя метод контурных токов. Для этого выразим

Тогда она примет вид:

Найдем решение системы по методу Халецкого.

Результат решения методом Халецкого:

Подставив в замену метода контурных токов, получим:

Проверим правильность найденного решения с помощью уравнения баланса мощностей источника и приемников электрической энергии.

Значит, найденное решение правильно.

Далее, рассчитаем значение напряжения на заданной нагрузке при номинальных параметрах. Для этого рассчитаем сопротивление на участке L2, C3.

.

Таким образом, изменение напряжения на нагрузке описывается уравнением uH(t)=23,995*sin (w*t+1. 571). Очевидно, что оно не соответствует заданному u*H(t)=15*sin (w*t+2р/3).

1. 2 Оптимизация схемы

Метод покоординатного спуска.

Пусть нужно найти наименьшее значение целевой функции u=f (M)=f (x1, x2,…, xn). Здесь через М обозначена точка n-мерного пространства с координатами x1, x2,…, xn: M=(x1, x2,…, xn). Выберем какую-нибудь начальную точку М0=(x10, x20,…, xn0) и рассмотрим функцию f при фиксированных значениях всех переменных, кроме первой: f (x1, x20, x30,…, xn0). Тогда она превратится в функцию одной переменной x1. Изменяя эту переменную, будем двигаться от начальной точки x1=x10 в сторону убывания функции, пока не дойдем до ее минимума при x1=x11, после которого она начинает возрастать. Точку с координатами (x11, x20, x30,…, xn0) обозначим через М1, при этом f (M0) >= f (M1).

Фиксируем теперь переменные: x1=x11, x3= x30,…, xn=xn0 и рассмотрим функцию f как функцию одной переменной x2: f (x11, x22, x30…, xn0). Изменяя x2, будем опять двигаться от начального значения x2=x20 в сторону убывания функции, пока не дойдем до минимума при x2=x21. Точку с координатами {x11, x21, x30… xn0} обозначим через М2, при этом f (M1) > =f (M2).

Проведем такую же минимизацию целевой функции по переменным x3, x4,…, xn. Дойдя до переменной xn, снова вернемся к x1 и продолжим процесс. Эта процедура вполне оправдывает название метода. С ее помощью мы построим последовательность точек М0, М1, М2,…, которой соответствует монотонная последовательность значений функции f (M0) >= f (M1)>= f (M2) > =… Обрывая ее на некотором шаге k можно приближенно принять значение функции f (Mk) за ее наименьшее значение в рассматриваемой области.

Отметим, что данный метод сводит задачу поиска наименьшего значения функции нескольких переменных к многократному решению одномерных задач оптимизации. Если целевая функция f (x1, x2,…, xn) задана явной формулой и является дифференцируемой, то мы можем вычисллить ее частные производные и использовать их для определения направления убывания функции по каждой переменной и поиска соответствующих одномерных минимумов. В противном случае, когда явной формулы для целевой функции нет, одномерные задачи следует решать с помощью одномерных методов.

На рис. 1 изображены линии уровня некоторой функции двух переменных u= f (х, у). Вдоль этих линий функция сохраняет постоянные значения, равные 1, 3, 5, 7, 9. Показана траектория поиска ее наименьшего значения, которое достигается в точке О, с помощью метода покоординатного спуска. При этом нужно ясно понимать, что рисунок служит только для иллюстрации метода. Когда мы приступаем к решению реальной задачи оптимизации, такого рисунка, содержащего в себе готовый ответ, у нас, конечно, нет.

Пусть требуется решить задачу (2):

f (x) —> min, х ОRn. (2)

В двумерном пространтсве R2. Решение задачи (2) методом покоординатного спуска, иначе называемого методом Гаусса — Зейделя, производят по следующей общей схеме.

Выбирают произвольно начальную точку х (0) из области определения функции f (х). Приближения х (k) определяются соотношениями (3):

x (k+1)=x (k)+t (k) S (k) (k=0,1,2,…),

где вектор направления спуска s (k) — это единичный вектор, совпадающий с каким-либо координатным направлением (например, если S (k) параллелен х1, то S (k)= {1,0,0,…, 0}, если он параллелен x2, то S (k)={0, 1, 0,…, 0} и т. д.); величина t (k) является решением задачи одномерной минимизации:

f (x (k)+ts (k)) -> min, t ОR1, (k=0,1,2,…),

и может определяться, в частности, методом сканирования.

Детальная реализация общей схемы в двумерном случае R2 дает траекторий приближения к точке х* методом покоординатного спуска, состоящую из звеньев ломаной, соединяющих точки х (k), х~(k), x (k+1) (k=0, 1, 2,) (рис. 2). При k=0, исходя из начальной точки х (0)=(x1 (0), x2 (0)), находят точку х~(0)= (x1~(0), x2 (0)), минимума функции одной переменной f (x1, x2 (0)); при этом f (x~(0))< =f (x (0)). Затем находят точку минимума x (1) функции f (x1~(0), x2) по второй координате. Далее делают следующий шаг вычислений при k=1. Полагают, что исходной точкой расчета является х (1). Фиксируя вторую координату точки х (1), находят точку минимума х~(1)= (x1~(1), x2 (1)), функции f (x1, x2 (1)) одной переменной x (1); при этом f (x~(1))< =f (x (1))< =f (x (0)). Точку х (2) получают, минимизируя целевую функцию f (x1~(1), x2), вновь по коорданате х2, фиксируя координату x1~(1), точки x (1), и т. д.

Условием прекращения вычислительной процедуры при достижении заданной точности e может служить неравенство

||x (k+1) — x (k) ||<e (4)

Блок-схема поиска минимума функции двух переменных методом покоординатного спуска.

Метод простого перебора

Будем предполагать, что искомый минимум является строгим, то есть при всех, и других точек локального минимума на отрезке нет. Предположим также, что точка минимума — внутренняя точка отрезка. Зададимся точностью, с которой будем приближённо отыскивать. Приближённое значение точки минимума обозначим, то есть — это такое число, что

Простейший способ обнаружить точку с точностью — это перебирать точки отрезка с шагом, начиная с, до тех пор, пока не будет выполнено условие, то есть пока функция не начнёт возрастать после точки минимума. При этом точка может оказаться либо на отрезке, либо на отрезке (cм. следующий чертёж):

Рис. 9. 15. Два случая расположения точки минимума при

Если теперь положить, то в любом из двух случаев будет выполнено неравенство, то есть точка минимума будет найдена с нужной нам точностью. За приближённое значение нужно теперь взять. Дополнительного вычисления функции при этом не потребуется, поскольку значение уже было найдено ранее.

Если не предполагать, что локальный минимум на отрезке только один и что точка минимума — внутренняя точка отрезка, то придётся изменить метод так: вычислять значения до тех пор, пока точка не достигнет правого конца отрезка — точки; на каждом шаге сравнивать текущее значение с минимальным из предыдущих значений, заменяя это минимальное значение на при. Наконец, вычислить (если точка не совпадает с последней из точек) и также сравнить с минимальным из предыдущих значений. После этой процедуры будет приближённо равно, а та точка, в которой получено значение функции, равное — приближённым значением точки минимума.

Заметим, что метод простого перебора при поиске точки экстремума аналогичен методу простого перебора при поиске корня уравнения.

Расчет оптимизации схемы

Многомерная оптимизация производится методом покоординатного спуска, который заключается в пошаговом переходе от начальных значений аргументов функции к значениям, при которых значения функции удовлетворяют заданным условиям. В процессе каждого шага метода покоординатного спуска в задаче выполняется метод одномерной оптимизации — метод простого перебора, заключающийся в переборе всех заданных значений аргумента, при котором значение оптимизируемой функции минимально.

Оптимизируемая функция имеет вид, где t-время проведения задачи оптимизации, равное 1 мин.

Для нахождения значения тока на заданной нагрузке преобразуем систему уравнений с учетом фазового сдвига между током и напряжением:

Критерием завершения итерационного процесса является выполнение одного из следующих условий:

,

где е — заданная точность поиска, k — номер итерации.

Например, для времени проведения задачи оптимизации 60 с, шага дискретизации 0,1 с и е=1 получим значение целевой функции равное 2 190 326 при первой итерации. Такое значение не удовлетворяет заданным условиям, поэтому мы продолжаем поиск оптимального значения целевой функции в рамках значений наших аргументов.

2. Программная реализация

2. 1 Информационное обеспечение

В процессе написания программы были созданы следующие классы:

1) TVetv — класс ветвей схемы. Обладает полями:

а) FSopr: double — хранит общее сопротивление ветви

б) XC, XL: double — хранит емкостное и индуктивное сопротивления ветви.

в) FUgol: double — хранит фазовый сдвиг между током и напряжением.

г) FSToka: double — хранит значение силы тока ветви.

Содержит процедуру constructor create (Rv, Lv, Cv: double) — процедура создания ветви при начальных значениях сопротивления, индуктивности, емкости.

2) TUchastok — класс участков оптимизации. Потомок класса TBrunch, обладает теми же полями и полем FTension: Double, которое служит для хранения значения напряжения на участке оптимизации. Содержит процедуры:

а) constructor create (Ru, Cu, t: double) создает участок оптимизации при задании начальных индуктивности, емкости и момента времени оптимизации.

б) procedure Raschet вычисляет разницу dU между Uopt и Uisk за время проведения задачи оптимизации.

Переменные созданных классов:

1) Vetv: array [1. 5] of TBrunch — массив ветвей электрической схемы.

2) Uchastok: TUchastok — участок оптимизации.

Массивы:

1) R, L, C: array [1. 5] of Double — исходные данные ветви (сопротивление, индуктивность, емкость).

2) FOpt: array [1…50] of Double — массив значений целевой функции, хранящий значение каждой итерации.

Действительные переменные:

1) Rv, Lv, Cv: Double — эти переменные используются при создании новой ветви.

2) Lu, Cu: double — эти переменные используются при создании участка оптимизации.

3) Ik1, Ik2, Ik3: Double — контурные токи схемы.

4) U, Uopt, Uisk: Double — напряжения (источника, заданное, на участке оптимизации, разница между Uopt и Uisk) схемы.

5) t: double — время проведения задачи оптимизации.

6) minR, minC, minRv, minCv, min: double — используются в процессе оптимизации; minR — запоминает оптимальное значение R3 во время итерационного процесса, minC — запоминает оптимальное значение С2 во время итерационного процесса.

7) z — золотое сечение, определяется по формуле

8) S: array [1. 6] of double; - массив для расчёта сопротивлений ветвей; используется для решения системы уравнений методом Гаусса.

Целые переменные:

1) Time. Value: integer — максимальное время проведения задачи оптимизации; не более 60 с.

2) StepAngle. Value: integer — шаг дискретизации; не более 0,01 с.

3) Pogr. Value: integer — погрешность е.

Логические переменные:

1) Nominal: Boolean — логическая переменная; при истинном значение производится расчет при номинальных значениях C2 и R3, при ложном — с учетом фазового сдвига между током и напряжением.

2. 2 Математический аппарат

моделирование электрический сопротивление халецкий

Одним из прямых (точных) методов решения систем линейных уравнений является метод основанный на схеме Халецкого.

Пусть система линейных уравнений дана в матричном виде.

Ax=b (1)

где, А — квадратная матрица порядка n, а x, b — векторы столбцы.

Представим матрицу, А в виде произведения нижней треугольной матрицы С и верхней треугольной матрицы В с единичной диагональю, т. е.

А=СВ,

где

Причем элементы сij и bij определяются по формулам:

(2)

Уравнение (1) можно записать в следующем виде:

CBx=b. (3)

Произведение Bx матрицы B на вектор-столбец x является вектором-столбцом, который обозначим через y:

Bx=y. (4)

Тогда уравнение (2) перепишем в виде:

Cy=b. (5)

Здесь элементы cij известны, так как матрица, А системы (1) считается уже разложенной на произведение двух треугольных матриц С и В.

Перемножив матрицы в левой части равенства (5), получаем систему уравнений из которой получаем следующие формулы для определения неизвестных:

(6)

неизвестные yi удобно вычислять вместе с элементами bij.

После того как все yi определены по формулам (6), подставляем их в уравнение (4).

Так как коэффициенты bij определены (2), то значения неизвестных, начиная с последнего, вычисляем по следующим формулам:

2. 3 Алгоритмическое обеспечение

Алгоритм оптимизации:

2. 4 Программное обеспечение

Написанная программа представляет собой несколько файлов. Среди них самыми важными являются Project1. dpr, Unit1. dfm и Unit1. pas.

Файл Project1. dpr, проект программ, связывает между собой все файлы, входящие в состав программы.

Файл Unit1. dfm — внешний вид, интерфейс программы. Подробнее о нем рассказано в п. 3.2.

Файл Unit1. pas содержит весь программный код и представляет собой используемые функции, процедуры, переменные и компоненты. Подробнее его можно рассмотреть в приложении.

Файл Shema. jpg необходим для отображения электрической схемы, для которой производились расчёты и оптимизация

3. Скриншот

Рис. 5 — Скриншот «Ввод данных»

Рис. 6 — Скриншот «Расчёт схемы»

Рис. 7- Скриншот «Оптимизация схемы»

Заключение

В процессе разработки программы было выяснено, что решение системы уравнений методом Халецкого легко программируется. Выяснено, что матричным методом можно решать системы из любого количества уравнений.

Также был рассмотрен метод многомерной оптимизации — метод покоординатного спуска. Этот метод легок в программировании, так как не требует знания функции в явном виде. Но у этого метода есть недостаток: в случае, если функция быстрее всего убывает в сторону какого-то одного предела, то достигнув этого предела, оптимизация завершается, хотя, возможно, что это только точка локального минимума.

Приложения

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, ComCtrls, Spin, ExtCtrls, jpeg;

type

TVetv = class

FSopr: double;

XC, XL: double;

FUgol: double;

FSToka: double;

constructor create (Rv, Lv, Cv: double);

end;

TUchastok = class (TVetv)

FNapr: Double;

constructor create (Lu, Cu, t: Double);

procedure Raschet;

end;

TForm1 = class (TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

Memo1: TMemo;

StringGrid1: TStringGrid;

Button1: TButton;

Label1: TLabel;

Label3: TLabel;

Time: TSpinEdit;

StepAngle: TSpinEdit;

Pogr: TSpinEdit;

Label2: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label8: TLabel;

Label9: TLabel;

Button3: TButton;

TabSheet3: TTabSheet;

Label7: TLabel;

StringGrid2: TStringGrid;

Button2: TButton;

Shema: TImage;

RadioGroup1: TRadioGroup;

procedure Vvod (Sender: TObject);

procedure Button1Click (Sender: TObject);

procedure Haletsky (t: double);

procedure Button2Click (Sender: TObject);

procedure Face (Sender: TObject);

procedure Button3Click (Sender: TObject);

procedure RadioGroup1Click (Sender: TObject);

private

{Private declarations}

public

{Public declarations}

end;

var

Form1: TForm1;

Vetv: array [1. 6] of TVetv;

Uchastok: TUchastok;

r, c, l, s: array [1. 6] of double;

Rv, Lv, Cv: Double;

Nominal: Boolean;

FOpt: array [1. 20 000] of double;

Lu, Cu: double;

t, U, Uopt, Uisk, dU, C2, Q, Q1, Q2: double;

Qopt: array [1. 50] of double;

g: integer;

implementation

{$R *. dfm}

constructor TVetv. create (Rv, Lv, Cv: double);

begin

inherited create;

if Cv=0 then else XC: =1/(100*Pi*Cv);

If Lv=0 then else XL: =100*Pi*Lv;

FSopr: =sqrt (sqr (Rv)+sqr (XL-XC));

if (Rv=0) and ((XL-XC)< 0) then FUgol: =-Pi/2 else

if (Rv=0) and ((XL-XC)> 0) then FUgol: =Pi/2 else

FUgol: =arctan ((XL-XC)/Rv);

end;

constructor TUchastok. create (Lu, Cu, t: Double);

begin

inherited create (1,1,1);

FSopr: =sqrt (sqr (XL-XC));

if ((XL-XC)< 0) then FUgol: =-Pi/2 else

if ((XL-XC)> 0) then FUgol: =Pi/2;

FSToka: =Vetv[5]. FSToka;

if Nominal then FNapr: =FSopr*FSToka

else FNapr: =FSopr*FSToka*sin (100*Pi*t+FUgol);

end;

procedure TUchastok. Raschet;

begin

t: =0; Uisk: =0; Uopt: =0; Q: =0;

while t< =Form1. Time. Value do

begin

Form1. Haletsky (t);

Lu: =L[3] - 0. 001; Cu: =C[3];

Uchastok: =TUchastok. create (Lu, Cu, t);

Uopt: =15*sin ((100*Pi*t)*Pi/180+2*Pi/3);

Uisk: =Uchastok. FNapr*sin ((100*Pi*t)*Pi/180+Uchastok. FUgol);

Q: =Q+sqr (Uopt-Uisk);

t: =t+Form1. StepAngle. Value/10;

end;

end;

procedure TForm1. Vvod (Sender: TObject);

var i: integer;

begin

R[1]: =500; R[2]: =1000; R[3]: =0; R[4]: =0; R[6]: =100;

L[1]: =0; L[2]: =0; L[3]: =0. 001+0. 005; L[4]: =0; L[5]: =0; L[6]: =0;

C[1]: =0; C[2]: =0. 0001; C[3]: =0. 0002; C[5]: =0; C[6]: =0;

if nominal then begin

R[5]: =500;

C[4]: =0. 5;

end;

For i: =1 to 6 do

begin

Rv: =R[i]; Lv: =L[i]; Cv: =C[i];

Vetv[i]: =TVetv. create (Rv, Lv, Cv);

end;

end;

procedure TForm1. Button1Click (Sender: TObject);

var i: integer;

begin

Nominal: =True;

// Ввод данных

StringGrid1. Cells [0,0]: ='№ ветви';

StringGrid1. Cells [1,0]: ='Сопротивление, Ом';

StringGrid1. Cells [2,0]: ='Угол сдвига, рад';

StringGrid1. Cells [3,0]: ='Сила тока, А';

Vvod (sender);

For i: =1 to 6 do

begin

StringGrid1. cells [0, i]: =inttostr (i);

StringGrid1. cells [1, i]: =floattostr (Vetv[i]. FSopr);

StringGrid1. cells [2, i]: =floattostr (Vetv[i]. FUgol);

end;

Haletsky (t);

for i: =1 to 6 do StringGrid1. cells [3, i]: =floattostr (Vetv[i]. FSToka);

Lu: =L[3] - 0. 001; Cu: =C[3];

Uchastok: =TUchastok. create (Lu, Cu, t);

label3. Caption: =floattostr (abs (Vetv[1]. FSToka*U))+' = '+floattostr (sqr (Vetv[1]. FSToka)*S[1]+sqr (Vetv[2]. FSToka)*S[2]+sqr (Vetv[3]. FSToka)*S[3]+sqr (Vetv[4]. FSToka)*S[4]+sqr (Vetv[5]. FSToka)*S[5]+sqr (Vetv[6]. FSToka)*S[6]);

Label1. Caption: =floattostr (Uchastok. FNapr)+'*sin (wt+('+floattostr (Uchastok. FUgol)+'))';

end;

procedure TForm1. Haletsky (t: double);

var a, d, c: array [1. 3,1. 3] of double;

b, x, y: array [1. 3] of double;

j, i, n: Integer;

Ik1, Ik2, Ik3: Double;

begin

n: =3;

if Nominal then

begin

for i: =1 to 6 do

S[i]: =Vetv[i]. FSopr;

U: =100;

end

else

begin

for i: =1 to 6 do

S[i]: =abs (Vetv[i]. FSopr*sin ((100*Pi*t)*Pi/180+Vetv[i]. FUgol));

U: =abs (100*sin ((100*Pi*t)*Pi/180));

end;

a [1,1]: =S[1]+S[4]+S[5]; a [1,2]: =-S[5]; a [1,3]: =-S[4];

a [2,1]: =-S[5]; a [2,2]: =S[2]+S[5]+S[6]; a [2,3]: =-S[6];

a [3,1]: =-S[4]; a [3,2]: =-S[6]; a [3,3]: =S[3]+S[6]+S[4];

b[1]: =U; b[2]: =0; b[3]: =0;

for i: =1 to 3 do

begin

j: =1;

d [i, j]: =a [i, j];

end;

for j: =1 to 3 do

c [1, j]: =a [1, j]/d [1,1];

d [2,2]: =a [2,2] - d [2,1]*c [1,2];

c [2,3]: =1/d [2,2]*(a [2,3] - d [2,1]*c [1,3]);

d [3,2]: =a [3,2] - d [3,1]*c [1,2];

d [3,3]: =a [3,3] - d [3,1]*c [1,3] - d [3,2]*c [2,3];

y[1]: =b[1]/d [1,1];

y[2]: =1/d [2,2]*(b[2] - d [2,1]*y[1]);

y[3]: =1/d [3,3]*(b[3] - d [3,1]*y[1] - d [3,2]*y[2]);

x[3]: =y[3];

x[2]: =y[2] - c [2,3]*x[3];

x[1]: =y[1] - c [1,2]*x[2] - c [1,3]*x[3];

ik1: =x[1];

ik2: =x[2];

ik3: =x[3];

Vetv[1]. FSToka:=Ik1;

Vetv[2]. FSToka:=Ik2;

Vetv[3]. FSToka:=Ik3;

Vetv[4]. FSToka:=Ik1-Ik3;

Vetv[5]. FSToka:=Ik1-Ik2;

Vetv[6]. FSToka:=Ik3-ik2;

end;

procedure TForm1. Button2Click (Sender: TObject);

var minR, minC, MaxR, MaxC, C1, C2, R1, R2, z, min: double;

label 1;

begin

for g: =1 to 100 do

begin

stringGrid2. Cells [0, g]: ='';

stringGrid2. Cells [1, g]: ='';

stringGrid2. Cells [2, g]: ='';

stringGrid2. Cells [3, g]: ='';

end;

Nominal: =False;

StringGrid2. Cells [0,0]: ='№ итер. ';

StringGrid2. Cells [1,0]: ='Емкость, Ф';

StringGrid2. Cells [2,0]: ='Сопротивление, Ом';

StringGrid2. Cells [3,0]: ='Целевая функция';

g: =1;

C[4]: =0. 5; R[5]: =500;

Vvod (Sender);

Uchastok. Raschet;

min: =Q;

stringGrid2. Cells [0, g]: =inttostr (g);

stringGrid2. Cells [1, g]: =floattostr (C[4]);

stringGrid2. Cells [2, g]: =floattostr (R[5]);

stringGrid2. Cells [3, g]: =floattostr (min);

if min< pogr. Value then goto 1;

z: =(sqrt (5) — 1)/2; C1: =0; C2: =0; R1: =0; R2: =0;

Nominal: =False;

minC: =0. 2; MinR: =100;

MaxC: =0. 0001; MaxR: =1000;

while not Nominal do

begin

g: =g+1;

Repeat

begin

C[4]: =minC; R[5]: =minR+100;

Vvod (Sender);

Uchastok. Raschet;

Q1: =Q;

C[4]: =maxC; R[5]: =maxR+100;

Vvod (Sender);

Uchastok. Raschet;

Q2: =Q;

if Q1=Q2 then

begin

C1: =minC+z*(MaxC-MinC);

C2: =maxC-z*(MaxC-MinC);

Qopt[g]: =Q1;

end;

if Q1< Q2 then

begin

C1: =minC;

C2: =maxC-z*(MaxC-MinC);

Qopt[g]: =Q1;

end;

if Q1> Q2 then

begin

C1: =minC+z*(MaxC-MinC);

C2: =maxC;

Qopt[g]: =Q2;

end;

minC: =C1;

MaxC: =C2;

if ((abs (QOpt[g])< 1) or ((g> 1) and (abs (Qopt[g] - Qopt [g-1])< 1))) then Nominal: =True;

stringGrid2. Cells [0, g]: =inttostr (g);

stringGrid2. Cells [1, g]: =floattostr (minc);

stringGrid2. Cells [2, g]: =floattostr (minr);

stringGrid2. Cells [3, g]: =floattostr (Qopt[g]);

end;

until C2-C1<0. 001;

repeat

begin

g: =g+1;

C[4]: =minC; R[5]: =minR+100;

Vvod (Sender);

Uchastok. Raschet;

Q1: =Q;

C[4]: =maxC; R[5]: =maxR+100;

Vvod (Sender);

Uchastok. Raschet;

Q2: =Q;

if Q1=Q2 then

begin

R1: =minR+z*(MaxR-MinR);

R2: =maxR-z*(MaxR-MinR);

Qopt[g]: =Q1;

end;

if Q1< Q2 then

begin

R1: =minR;

R2: =maxR-z*(MaxR-MinR);

Qopt[g]: =Q1;

end;

if Q1> Q2 then

begin

R1: =minR+z*(MaxR-MinR);

R2: =maxR;

Qopt[g]: =Q2;

end;

minR: =R1;

MaxR: =R2;

if ((abs (QOpt[g])< 1) or ((g> 1) and (abs (Qopt[g] - Qopt [g-1])< 1))) then Nominal: =True;

stringGrid2. Cells [0, g]: =inttostr (g);

stringGrid2. Cells [1, g]: =floattostr (minc);

stringGrid2. Cells [2, g]: =floattostr (minr);

stringGrid2. Cells [3, g]: =floattostr (Qopt[g]);

end;

until R2-R1<0. 001;

// Вывод данных

end;

1: end;

procedure TForm1. Face (Sender: TObject);

begin

Form1. Caption: ='Расчёт и оптимизация электрической цепи';

label2. Caption: ='Время проведения задачи'+#13#10+'оптимизации, с';

label5. Caption: ='Время' +#13#10+'дискретизации, с/100';

label8. Caption: ='Погрешность';

label9. Caption: ='Характеристики ветвей';

Label6. Caption: ='Баланс мощностей';

Label4. Caption: ='Напряжение на оптимизируемом участке';

Label7. Caption: ='Значения изменяемых величин и целевой функции';

Shema. Picture. LoadFromFile ('Shema. jpg');

Shema. Proportional: =True;

Shema. Visible: =true;

label2. Visible: =false;

label8. Visible: =false;

label5. Visible: =false;

StepAngle. Visible: =false;

Pogr. Visible: =false;

Time. Visible: =false;

end;

procedure TForm1. Button3Click (Sender: TObject);

begin

Close;

end;

procedure TForm1. RadioGroup1Click (Sender: TObject);

begin

if RadioGroup1. ItemIndex=0 then

begin

label2. Visible: =false;

label8. Visible: =false;

label5. Visible: =false;

StepAngle. Visible: =false;

Pogr. Visible: =false;

Time. Visible: =false;

StepAngle. Value: =1;

Pogr. Value: =1;

Time. Value: =1;

end;

if RadioGroup1. ItemIndex=1 then

begin

label2. Visible: =true;

label8. Visible: =true;

label5. Visible: =true;

StepAngle. Visible: =true;

Pogr. Visible: =true;

Time. Visible: =true; end; end; end.

ПоказатьСвернуть
Заполнить форму текущей работой