- •Часть III
- •Свойства компонента Edit (поле ввода-редактирования)
- •Свойства компонента Label (поле ввода-редактирования)
- •Свойства компонента Button (командная кнопка)
- •Пример составления программы
- •Значение свойства Caption для переменных типа Label
- •Значение свойства Caption для переменных типа Button
- •Задания по вариантам
- •Свойства компонента RadioGroup
- •Пример составления программы
- •Задания по вариантам
- •Лабораторная работа №3 Цель работы
- •Программа работы
- •Пример составления программы
- •Задания по вариантам
- •Пример составления программы
- •Задания по вариантам
- •Свойства компонента CheckBox
- •Свойства компонента SpinEdit
- •Пример составления программы
- •Задание по вариантам
- •Пример составление программы
- •Свойства компонента Memo
- •Свойства компонента ProgressBar
- •Пример составление программы
- •Составление системы уравнений для схемы
- •Задания по вариантам
- •Литература
Пример составление программы
Пример 7.1. На рисунке приведена схема. Составить и рассчитать систему дифференциальных уравнений. Построить графики переходных процессов.
Составление системы уравнений для схемы
Cоставим систему дифференциальных уравнений.
Преобразовав уравнения, получим систему уравнений:
Составим таблицу производных
№ |
|
|
Правая часть системы уравнений |
1. |
|
|
|
2. |
|
|
|
Для выполнения задания нам понадобится так же компоненты Image, Chart, компоненты типа Button для организации кнопок расчета и выхода, которые рассматривались в предыдущих работах.
Вынесем требуемые компоненты на форму и расположим их так, как показано на рис. 7.1.
Рис. 7.1а. Пример расположения компонента PageControl на форме |
Рис. 7.1б. Пример расположения компонента Memo на форме |
Рис. 7.2. Общий вид формы |
|
Запуск программы осуществляется по нажатию клавиши F9. Результаты работы программы представлены на рис. 7.3. и рис. 7.4.
Рис. 7.3. Результаты работы программы (панель 1) |
Рис. 7.4. Результаты работы программы (панель 2) |
Полный текст программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, StdCtrls, ComCtrls, TeEngine, Series, TeeProcs,
Chart;
type
IntType = Integer;
RealType = Real;
Vector = Array[1..2] of RealType;
Matrix = Array[1..2,1..2] of RealType;
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
Button1: TButton;
Button2: TButton;
Image1: TImage;
Memo1: TMemo;
ProgressBar1: TProgressBar;
ProgressBar2: TProgressBar;
Label1: TLabel;
Label2: TLabel;
Chart1: TChart;
Series1: TLineSeries;
Chart2: TChart;
Series2: TLineSeries;
Label3: TLabel;
Edit1: TEdit;
Label4: TLabel;
Edit2: TEdit;
Label5: TLabel;
Edit3: TEdit;
Label6: TLabel;
Edit4: TEdit;
Label7: TLabel;
Edit5: TEdit;
Label8: TLabel;
Edit6: TEdit;
Label9: TLabel;
Edit7: TEdit;
Label10: TLabel;
Edit8: TEdit;
Button3: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
N,M : IntType;
U,C1,L2,R3 : RealType;
t0, tmax, dt, t : RealType;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
Procedure Gauss(A:Matrix; B:Vector; Var X:Vector);
Var
i, j, k : IntType;
h : RealType;
Begin
{прямой ход}
For i:= 1 to N do
For j:= i+1 to N do
begin
A[j,i]:= - A[j,i]/A[i,i];
B[j]:= B[j] + A[j,i]*B[i];
For k:= i+1 to N do
A[j,k]:= A[j,k] + A[j,i]*A[i,k];
end;
{обратный ход }
X[N]:= B[N]/A[N,N];
For i:= N-1 downto 1 do
begin
h:= B[i];
For j:= i+1 to N do h:= h - X[j] * A[i,j];
X[i]:= h/A[i,i];
Form1.ProgressBar2.Position:=Round(100/i/(N-1));
end;
end;
Procedure dFdt(t:RealType; Var X, dX : Vector);
Var
i,j : Integer;
A : Matrix;
B : Vector;
begin
For i:=1 to N do
For j:=1 to N do
A[i,j]:= 0;
A[1,1]:= L2; A[1,2]:= -C1*R3;
A[2,2]:= C1*R3;
B[1]:= -3*X[1];
B[2]:= U-X[2]+R3*X[1];
Gauss(A,B,dX);
end;
Procedure Eler;
Var
i : IntType;
X, dX : Vector;
begin
For i:=1 to N do X[i]:=0;
t:= t0;
While t<= tmax do
begin
Form1.Chart1.SeriesList[0].AddXY(t,X[1]);
Form1.Chart2.SeriesList[0].AddXY(t,X[2]);
dFdt(t,X,dX);
For i:=1 to N do
X[i]:=X[i]+dt*dX[i];
t:=t+dt;
Form1.ProgressBar1.Position:=Round(100/t/(N-1));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Chart1.SeriesList[0].Clear;
Chart2.SeriesList[0].Clear;
U:=StrToFloat(Form1.Edit1.Text);
C1:=StrToFloat(Form1.Edit2.Text);
L2:=StrToFloat(Form1.Edit3.Text);
R3:=StrToFloat(Form1.Edit4.Text);
N:= StrToInt(Form1.Edit8.Text);
t0:= StrToFloat(Form1.Edit5.Text);
tmax:= StrToFloat(Form1.Edit6.Text);
M:= StrToInt(Form1.Edit7.Text);
dt:= (tmax-t0)/M;
Eler;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Chart1.SeriesList[0].Clear;
Chart2.SeriesList[0].Clear;
end;
end.