Численные методы

Сущность методики аппроксимации, последовательность действий при работе в среде Еxcel. Решение дифференциального уравнения первого порядка аналитико-сеточным методом с постоянным воздействием Yас и методом трапеций. Реализация численных решений в Excel.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 02.12.2014
Размер файла 564,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ОГЛАВЛЕНИЕ

1. АППРОКСИМАЦИЯ

1.1 Основы методики

1.2 Последовательность действий при работе в среде Excel

1.3 Результаты аппроксимации

2. РЕШЕНИЕ ОБЫКНОВЕННОГО ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ ПЕРВОГО ПОРЯДКА

2.1 Постановка задачи

2.2 Решение ОДУ1 разностным методом (первая разностная схема)

2.3 Решение ОДУ1 разностным методом (вторая разностная схема)

2.4 Реализация численных решений в среде Excel

2.5 Блок-схема программы решения уравнения

2.6 Графики в среде Delphi

2.7 Листинг файла OutPut.txt

ВЫВОД

СПИСОК ЛИТЕРАТУРЫ

ПРИЛОЖЕНИЕ

1. АППРОКСИМАЦИЯ

1.1 Основы методики

Аппроксимация - приближенное выражение математических объектов через другие, более простые (например, алгебраические или трансцендентные функции). Чаще всего для аппроксимации заданных табулированных функций используют формулы получаемые методом наименьших квадратов. Вид формулы задается, а коэффициенты формулы подбираются путем минимизации функционала, представляющего собой сумму квадратов невязок (квадратов разностей заданных значений функции и значений, полученных по аппроксимирующей формуле).

Суть аппроксимации заключается в том, что заданную таблично (табулированную) функциональную зависимость y=f(x) приближенно отражают (аппроксимируют) другой функцией (как правило, в виде аналитической зависимости), проходящей возможно ближе к точкам с координатами (xi, yi), но не требуют совпадения значений аппроксимирующей и табулированной функций в точках (xi, yi). При подобной аппроксимации чаще всего используется метод наименьших квадратов и надстройку «Поиск решения».

1.2 Последовательность действий при работе в среде Excel.

1. Подлежащая обработке выборка экспериментальных данных представляется на диаграмме набором точек с координатами X, Y (строится точечная диаграмма);

2. Анализируя вид представленной на диаграмме зависимости, можно подобрать аналитическое выражение для аппроксимирующей функции Ya=f(X) и выбрать в первом приближении значения ее коэффициентов;

3. Для уточнения значений коэффициентов аппроксимирующей функции следует организовать таблицу, в колонках которой содержатся: экспериментальные значения Xi, Yi; значения, полученные для аппроксимирующей функции Yai и квадраты невязок (Yi-Yai)2. В отдельных ячейках размещаются значения коэффициентов для аппроксимирующей функции и значение суммы квадратов невязок для всей выборки д. Для удобства точки со значениями значений Xi и Yi на диаграмме следует отображать маркерами, а зависимость Ya=f(X) - сплошной линией.

4. При уточнении значений коэффициентов аппроксимирующей функции следует обратиться к пункту меню Сервис Поиск решения. В открывшемся диалоговом окне Поиск решения в качестве целевой ячейки указывается ячейка содержащая значение д, а переключатель Равной: устанавливается на минимальное значение. В окне Изменяя ячейки указывается перечень ячеек, в которых находятся значения коэффициентов аппроксимирующей функции. Если необходимо установить ограничения на значения коэффициентов следует обратиться к списку ограничения. Для проведения уточнения надо нажать кнопку Выполнить.

Для оценки состоятельности проведенной аппроксимации используется относительная оценка R2:

(1.1)

Чем ближе значение R2 к единице, тем лучше график аппроксимирующей функции согласуется с экспериментальными данными.

1.3 Результаты аппроксимации

Таблица 1.1 Аппроксимация МНК

i

X

Y

Y2

Ya

(Ya-Y)2

1

0,0

0,5000

0,250

0,497

0,000

2

0,3

1,2457

1,552

1,213

0,001

3

0,6

1,7430

3,038

1,731

0,000

4

0,9

1,9070

3,636

1,923

0,000

5

1,2

1,7244

2,973

1,774

0,002

6

1,5

1,3915

1,936

1,389

0,000

7

1,8

0,9696

0,940

0,954

0,000

8

2,1

0,6847

0,469

0,674

0,000

9

2,4

0,6940

0,482

0,700

0,000

10

2,7

1,0719

1,149

1,074

0,000

11

3,0

1,7131

2,935

1,719

0,000

12

3,3

2,4452

5,979

2,461

0,000

13

3,6

3,0913

9,556

3,094

0,000

14

3,9

3,4490

11,896

3,450

0,000

15

4,2

3,4288

11,757

3,455

0,001

16

4,5

3,1522

9,937

3,162

0,000

17

4,8

2,7360

7,486

2,724

0,000

18

5,1

2,3523

5,533

2,348

0,000

19

5,4

2,2078

4,874

2,216

0,000

20

5,7

2,3999

5,760

2,429

0,001

21

6,0

2,9239

8,549

2,963

0,002

22

6,3

3,6804

13,545

3,684

0,000

23

6,6

4,3991

19,352

4,394

0,000

24

6,9

4,9183

24,190

4,896

0,000

25

7,2

5,0627

25,631

5,068

0,000

26

7,5

4,9186

24,193

4,902

0,000

27

7,8

4,5286

20,508

4,508

0,000

28

8,1

4,0899

16,727

4,077

0,000

29

8,4

3,8183

14,580

3,811

0,000

30

8,7

3,8472

14,801

3,857

0,000

31

9,0

4,2724

18,254

4,249

0,001

32

9,3

4,9439

24,442

4,905

0,002

33

9,6

5,6608

32,045

5,647

0,000

34

9,9

6,2909

39,576

6,268

0,001

35

10,2

6,5982

43,536

6,604

0,000

36

10,5

6,5961

43,508

6,590

0,000

37

10,8

6,2913

39,581

6,283

0,000

38

11,1

5,8154

33,819

5,843

0,001

39

11,4

5,4989

30,238

5,477

0,000

40

11,7

5,3589

28,718

5,363

0,000

41

12,0

5,6177

31,558

5,596

0,000

42

12,3

6,1542

37,874

6,145

0,000

43

12,6

6,8631

47,102

6,872

0,000

44

12,9

7,5923

57,643

7,574

0,000

45

13,2

8,0615

64,988

8,060

0,000

46

13,5

8,1995

67,233

8,212

0,000

47

13,8

8,0255

64,408

8,028

0,000

48

14,1

7,6299

58,215

7,627

0,000

49

14,4

7,1736

51,461

7,200

0,001

50

14,7

6,9607

48,452

6,949

0,000

51

15,0

7,0126

49,176

7,014

0,000

52

15,3

7,3837

54,519

7,426

0,002

53

15,6

8,0728

65,170

8,091

0,000

54

15,9

8,8547

78,406

8,832

0,001

55

16,2

9,4336

88,993

9,440

0,000

56

16,5

9,7239

94,554

9,757

0,001

57

16,8

9,7270

94,614

9,724

0,000

58

17,1

9,4122

88,590

9,405

0,000

59

17,4

8,9712

80,483

8,963

0,000

60

17,7

8,6055

74,055

8,606

0,000

Принята аппроксимирующая функция

Полученные коэффициенты функции

a=

0,5

b=

0,5

c=

1,002

d=

2,000

Оценка эффективности аппроксимации

S=0,02

R2=1

где S- сумма квадратов невязок,

R2 - оценка.

Результаты аппроксимации представлены на рис. 1.1.

аппроксимация дифференциальный численный

2. РЕШЕНИЕ ОБЫКНОВЕННОГО ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ ПЕРВОГО ПОРЯДКА

2.1 Постановка задачи

Решению подлежит обыкновенное дифференциальное уравнение первого порядка (ОДУ1) (2.1).

, (2.1)

где - время,

X - безразмерное значение воздействия,

Y - безразмерное значение реакции объекта,

А. К - коэффициенты отражающие свойства объекта.

Воздействие описывается синусоидой со сдвигом по фазе (2.2).

(2.2)

Аналитическое решение уравнения (2.1) при воздействии (2.2) имеет вид (2.3).

C1=

1

C2=

0,42842

C3=

0,89502

(2.3)

где:

2.2 Решение ОДУ1 разностным методом (первая разностная схема)

(2.4)

D1=

0,3679

D2=

0,3161

Абсолютное условие устойчивости 0<D<1

2.3 Решение ОДУ1 разностным методом (вторая разностная схема)

(2.5)

D3=

0,33333

D4=

0,33333

Абсолютное условие устойчивости 0< D<1

2.4 Реализация численных решений в среде Excel

Результаты решения уравнения (2.1) при воздействии (2.2) представлено в таблице 2.2. и на рис. 2.1.

Для тестирования правильности выполнения вычислений приняты следующие значения исходных данных (Таблица 2.1).

Таблица 2.1 Исходные данные

A=

0,5

a0=

1

K=

1

a1=

1

Y0=

0

a2=

-0,25

Dt=

0,5

a3=

1

Таблица 2.2 Результаты решения

i

t

X

Ya

Yтр

Yac

DYac

DYтр

dYac, %

dYтр, %

1

0

1,8415

0

0

0

0

0

0

0

2

0,5

1,7675

1,137

1,203

1,141

0,003

0,066

0,201

4,143

3

1

1,6816

1,505

1,551

1,510

0,005

0,046

0,318

2,908

4

1,5

1,5851

1,582

1,606

1,588

0,006

0,024

0,401

1,534

5

2

1,4794

1,545

1,557

1,553

0,007

0,011

0,467

0,723

6

2,5

1,3663

1,462

1,467

1,471

0,008

0,005

0,521

0,322

7

3

1,2474

1,358

1,360

1,367

0,009

0,002

0,565

0,142

8

3,5

1,1247

1,243

1,244

1,253

0,010

0,001

0,601

0,064

9

4

1,0000

1,122

1,123

1,132

0,010

0,001

0,626

0,032

10

4,5

0,8753

0,999

0,999

1,009

0,010

0,00

0,642

0,019

11

5

0,7526

0,876

0,876

0,886

0,010

0,00

0,648

0,014

12

5,5

0,6337

0,754

0,754

0,764

0,010

0,00

0,644

0,011

13

6

0,5206

0,636

0,636

0,646

0,010

0,00

0,629

0,010

14

6,5

0,4149

0,524

0,524

0,533

0,010

0,00

0,605

0,010

15

7

0,3184

0,419

0,419

0,428

0,009

0,00

0,571

0,009

16

7,5

0,2325

0,323

0,323

0,332

0,008

0,00

0,529

0,008

17

8

0,1585

0,238

0,238

0,246

0,008

0,00

0,478

0,007

18

8,5

0,0977

0,165

0,165

0,171

0,007

0,00

0,420

0,007

19

9

0,0510

0,104

0,105

0,110

0,006

0,00

0,355

0,005

20

9,5

0,0191

0,058

0,058

0,063

0,005

0,00

0,285

0,004

Условные обозначения:

Ya, Yас, Yтр - соответственно решения уравнения (2.1):

Yас, Yтр - соответственно абсолютная погрешность решения уравнения (2.1)

Yас, Yтр- соответственно относительная погрешность решения уравнения (2.1)

Значение относительной погрешности определялось по формуле (2.6).

. (2.6)

2.5 Блок-схема программы решения уравнения

2.6 Графики в среде Delphi

Рисунок 2.3 Аналитическое и численные решения

Рисунок 2.4 Относительные погрешности решения

2.7 Листинг файла OutPut.txt

A= 0.5000

K= 1.0000

Y0= 0.0000

Im= 20

DT= 0.50

a0= 1.0000

a1= 1.0000

a2=-0.2500

a3= 1.0000

ВЫВОДЫ

Численное решение уравнения ОДУ1 (2.1) аналитико-сеточным методом с постоянным воздействием и методом трапеций, проведенное в среде Excel и Delphi практически совпадает и хорошо соотносится с аналитическим решением уравнения.

СПИСОК ЛИТЕРАТУРЫ

1. Методические указания разработанные кафедрой “Техническая кибернетика” и электронные документы - методуказания к лабораторным работам по курсам “Численные методы” и “Моделирование систем”.

2. Волков Е.А. Численнные методы: Учебное пособие. - М.: Наука. Главная редакция физико-математической литературы, 1982. - 256 с.

3. Вычислительная техника и программирование. Часть 3 «Основы алгоритмизации, программирования и решения инженерных и экономических задач на ЭВМ». Учебное пособие / Под общей редакцией проф. Меркта Р.В. - Одесса: ОГМУ,2001. -86 с.

4. Годунов С.К., Рябенький В,С. Разностные схемы (введение в теорию). Учебное пособие. -М: Наука, 1973.- 400 с.

5. Лебедев А.Н. Моделирование в научно-технических исследованиях. -М.: Радио и связь. 1989. -224 с.

6. Львовский Е.Н. Статистические метода построения змпирических формул: Учеб. пособие для втузов. - 2-е изд. ,перераб. и доп. -М.:Вьісш. шк., 1988. -239 с.

7. Турчак Л.И. Основи численних методов: Учеб. Пособие. - М.: Наука, Гл. ред. физ.-мат. лит., 1987. - 320 с.

ПРИЛОЖЕНИЕ

program ODU1;

{$APPTYPE CONSOLE}

uses

SysUtils,

MyType,

Math,

classes, Graphics,

Graphik in 'Graphik.pas' {GraphikFm};

var

Im,I,Key: Ir;

A,K,Y0,DT,a0,a1,a2,a3,Start: Db;

D1,D2,D3,D4,C0,C1,C2,C3,Yamax,Yamin: Db;

T,X,Ya,Yac, Ytr, DYtr, DYac, ddYtr, ddYac: Vec;

F1,F2:TextFile;

begin

AssignFile(F1,'Input1.txt');

Reset(F1);

Readln(F1,A,K,Y0,Im,Dt,a0,a1,a2,a3,Start);

CloseFile(F1);

Writeln('A=', A:7:4, ' K=', K:7:4, ' Y0=', Y0:7:4);

Writeln(' Im=', Im:3, ' Dt=', Dt:5:2);

Writeln(' a0=', a0:7:4, ' a1=', a1:7:4, ' a2=', a2:7:4, ' a3=', a3:7:4);

Readln;

D1:=exp(-Dt/A);

D2:=K/2-K/2*exp(-Dt/A);

D3:=(2*A-Dt)/(2*A+Dt);

D4:=K*Dt/(2*A+Dt);

C1:=K*a0;

C2:=(K*a1*(cos(a3)+A*a2*sin(a3)))/((A*a2)*(A*a2)+1);

C3:=(K*a1*(sin(a3)-A*a2*cos(a3)))/((A*a2)*(A*a2)+1);

T[1]:=Start;

X[1]:=a0+a1*sin(a2*T[1])*cos(a3)+a1*cos(a2*T[1])*sin(a3);

Ya[1]:=(Y0-c1-c3)*exp(-T[1]/A)+c1+c2*sin(a2*T[1])+c3*cos(a2*T[1]);

Yac[1]:=Y0;

Ytr[1]:=Y0;

Yamin:=Ya[1];

Yamax:=Ya[1];

for I := 2 to Im do

begin

T[i]:=Start+Dt*(I-1);

X[i]:=a0+a1*sin(a2*T[i])*cos(a3)+a1*cos(a2*T[i])*sin(a3);

Ya[i]:=(Y0-c1-c3)*exp(-T[i]/A)+c1+c2*sin(a2*T[i])+c3*cos(a2*T[i]);

Yac[i]:=D1*Yac[i-1]+D2*(x[i-1]+X[i]);

Ytr[i]:=D3*Ytr[i-1]+D4*(X[i]+X[i-1]);

end;

for I := 1 to Im do

begin

if Ya[i]>Yamax then Yamax:=Ya[i] else

if Ya[i]<Yamin then Yamin:=Ya[i];

end;

for I := 1 to Im do

begin

DYac[i]:=Yac[i]-Ya[i];

DYtr[i]:=Ytr[i]-Ya[i];

ddYac[i]:=DYac[i]/(Yamax-Yamin)*100;

ddYtr[i]:=DYtr[i]/(Yamax-Yamin)*100;

end;

Writeln('T',#9,'X',#9,'Ya',#9,'Yac',#9,'Ytr'#9,'DYac',#9,'DYtr',#9,'ddYtr',#9,'ddYac');

for I := 1 to Im do

Writeln(T[i]:3:2,X[i]:8:2,Ya[i]:8:2, Yac[i]:8:2, Ytr[i]:8:2, DYac[i]:8:2, DYtr[i]:8:2, ddYtr[i]:8:2, ddYac[i]:8:2);

GrProp.Line1Color := clRed;

GrProp.Line2Color := clBlack;

GrProp.Line3Color := clBlue;

GrProp.Line4Color := clGreen;

GrProp.Point1Color := clRed;

GrProp.Point2Color := clBlack;

GrProp.Point3Color := clBlue;

GrProp.Point4Color := clGreen;

GrProp.GridDigitsY := 3;

GrProp.GridDigitsX := 3;

GrProp.Line1Caption := 'X(t)';

GrProp.Line2Caption := 'Ya(t)';

GrProp.Line3Caption := 'Yac(t)';

GrProp.Line4Caption := 'Ytr(t)';

ShowGraphik (T, X, T, Ya, T, Ytr, T, Yac, Im,Im,Im,Im);

GrProp.Line1Caption := 'dYac(t)';

GrProp.Line2Caption := 'dYtr(t)';

GrProp.Line3Caption := '';

GrProp.Line4Caption := '';

ShowGraphik (T, ddYac, T, ddYtr, T, Yac, T, Ytr, Im,Im,0,0);

AssignFile(F2,'Output1.txt');

ReWrite(F2);

Writeln(F2,'A=', A:7:4, ' K=', K:7:4, ' Y0=', Y0:7:4);

Writeln(F2,' Im=', Im:3, ' DT=', DT:5:2);

Writeln(F2,' a0=', a0:7:4, ' a1=', a1:7:4, ' a2=', a2:7:4, ' a3=', a3:7:4);

Writeln(F2, 'T',#9,'X',#9,'Ya',#9,'Yac'#9,'Ytr',#9,'DYac',#9,'DYtr',#9,'dYtr',#9,'dYac');

for I := 1 to Im do

Writeln(F2, T[i]:3:2,X[i]:8:4,Ya[i]:8:4, Yac[i]:8:4, Ytr[i]:8:4, DYac[i]:8:4, DYtr[i]:8:4, ddYtr[i]:8:4, ddYac[i]:8:4 );

CloseFile(F2);

readln;

end.

Текст модуля MyType

unit MyType;

interface

type

Ir = Integer;

Db = Double;

Vec = array[1..200] of Double;

implementation

end.

Текст модуля Graphik

unit Graphik;

interface

uses

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

Dialogs,MyType, ToolWin, ComCtrls, Menus, ExtCtrls;

type

TGraphikFm = class(TForm)

VectGraphPB: TPaintBox;

PaintBox1: TPaintBox;

procedure PaintBox1Paint(Sender: TObject);

procedure VectGraphPBPaint(Sender: TObject);

procedure FormResize(Sender: TObject);

private

ScaleX: Double;

ScaleY: Double;

// MScale: Double;

function GrToScrX(V: Double):Integer;

function GrToScrY(V: Double):Integer;

procedure DrawFizPnt(X,Y: Double);

procedure DrawFizLine( Cnv: TCanvas; X1,Y1,X2,Y2: Double);

public

PaintLock : Boolean;

VX1,VY1,VX2,VY2,VX3,VY3,VX4,VY4 : Vec;

VN1,VN2,VN3,VN4: Integer;

end;

TGrProp = record

Caption: String;

TopOff: Integer;

BottomOff: Integer;

LeftOff: Integer;

RightOff: Integer;

PointSize: Integer;

GridXCount: Integer;

GridYCount: Integer;

GridDigitsX : Integer;

GridDigitsY : Integer;

GridTextOff : Integer;

GridTextSize : Integer;

Line1Color: TColor;

Line2Color: TColor;

Line3Color: TColor;

Line4Color: TColor;

Point1Color: TColor;

Point2Color: TColor;

Point3Color: TColor;

Point4Color: TColor;

Point5Color: TColor;

Point6Color: TColor;

Line1Caption: string;

Line2Caption: string;

Line3Caption: string;

Line4Caption: string;

GridColor: TColor;

BacckgraundColor: TColor;

TextColor: TColor;

end;

var

GrProp : TGrProp;//Настройки графика

procedure ShowGraphik( VX1,VY1,VX2,VY2,VX3,VY3,VX4,VY4 : Vec; VN1,VN2,VN3,VN4: Integer);

implementation

{$R *.dfm}

uses IniFiles;

type

TGraphRange = record

MinX: Double;

MaxX: Double;

MinY: Double;

MaxY: Double;

NX : Integer;

NY : Integer;

end;

var

R : TGraphRange;

procedure LoadProp(FName: String);

var

Ini : TIniFile;

begin

Ini := TIniFile.Create(FName);

GrProp.TopOff := Ini.ReadInteger('Offset','Top',10);

GrProp.BottomOff := Ini.ReadInteger('Offset','Bottom',25);

GrProp.LeftOff := Ini.ReadInteger('Offset','Left',50);

GrProp.RightOff := Ini.ReadInteger('Offset','Right',10);

GrProp.GridTextOff := Ini.ReadInteger('Offset','Text',5);

GrProp.PointSize := Ini.ReadInteger('Size','Point',3);

GrProp.GridTextSize := Ini.ReadInteger('Size','Text',10);

GrProp.GridXCount := Ini.ReadInteger('Grid','XCount',10);

GrProp.GridYCount := Ini.ReadInteger('Grid','YCount',7);

GrProp.GridDigitsX := Ini.ReadInteger('Grid','XDigits',0);

GrProp.GridDigitsY := Ini.ReadInteger('Grid','YDigits',0);

GrProp.Line1Color := Ini.ReadInteger('Color','Line1',$008000);

GrProp.Line2Color := Ini.ReadInteger('Color','Line2',$008000);

GrProp.Line3Color := Ini.ReadInteger('Color','Line3',$008000);

GrProp.Line4Color := Ini.ReadInteger('Color','Line4',$008000);

GrProp.Point1Color := Ini.ReadInteger('Color','Point1',$0000FF);

GrProp.Point2Color := Ini.ReadInteger('Color','Point2',$0000FF);

GrProp.Point4Color := Ini.ReadInteger('Color','Point3',$0000FF);

GrProp.Point4Color := Ini.ReadInteger('Color','Point4',$0000FF);

GrProp.GridColor := Ini.ReadInteger('Color','Grid',$C0C0C0);

GrProp.BacckgraundColor := Ini.ReadInteger('Color','Backgraund',$FFFFFF);

GrProp.TextColor := Ini.ReadInteger('Color','Text',$000000);

GrProp.Line1Caption := '';

GrProp.Line2Caption := '';

GrProp.Line3Caption := '';

GrProp.Line4Caption := '';

Ini.Free;

end;

procedure MinMax(var Range: TGraphRange; X,Y:Vec; N:Integer; NewData: Boolean=False);

var

I : Integer;

K : Integer;

begin

if NewData then begin

K := 2;

Range.MinX := X[1];

Range.MaxX := X[1];

Range.MinY := Y[1];

Range.MaxY := Y[1];

end else begin

K := 1;

end;

for I := K to N do begin

if X[I] < Range.MinX then Range.MinX := X[I];

if X[I] > Range.MaxX then Range.MaxX := X[I];

if Y[I] < Range.MinY then Range.MinY := Y[I];

if Y[I] > Range.MaxY then Range.MaxY := Y[I];

end;

end;

procedure Normalize(var Range: TGraphRange);

begin

end;

procedure ShowGraphik( VX1,VY1,VX2,VY2,VX3,VY3,VX4,VY4 : Vec; VN1,VN2,VN3,VN4: Integer);

var

GraphikFm: TGraphikFm;

I : Integer;

begin

R.NX := GrProp.GridXCount;

R.NY := GrProp.GridYCount;

MinMax(R,VX1,VY1,VN1,True);

MinMax(R,VX2,VY2,VN2);

MinMax(R,VX3,VY3,VN3);

MinMax(R,VX4,VY4,VN4);

Normalize(R);

GraphikFm := TGraphikFm.Create(Application);

GraphikFm.PaintLock := True;

if GrProp.Caption <> '' then

GraphikFm.Caption := GrProp.Caption;

GraphikFm.VN1 := VN1;

for I := 1 to VN1 do begin

GraphikFm.Vx1[I] := Vx1[I];

GraphikFm.Vy1[I] := Vy1[I];

end;

GraphikFm.VN2 := VN2;

for I := 1 to VN2 do begin

GraphikFm.Vx2[I] := Vx2[I];

GraphikFm.Vy2[I] := Vy2[I];

end;

GraphikFm.VN3 := VN3;

for I := 1 to VN3 do begin

GraphikFm.VX3[I] := Vx3[I];

GraphikFm.VY3[I] := Vy3[I];

end;

GraphikFm.VN4 := VN4;

for I := 1 to VN4 do begin

GraphikFm.VX4[I] := Vx4[I];

GraphikFm.VY4[I] := Vy4[I];

end;

GraphikFm.Color := GrProp.BacckgraundColor;

GraphikFm.ShowModal;

GraphikFm.Free;

end;

procedure TGraphikFm.DrawFizLine(Cnv: TCanvas; X1, Y1, X2, Y2: Double);

var

PX1, PY1, PX2, PY2: Integer;

begin

PX1 := GrToScrX(X1);

PY1 := GrToScrY(Y1);

PX2 := GrToScrX(X2);

PY2 := GrToScrY(Y2);

with Cnv do begin

MoveTo(PX1, PY1);

LineTo(PX2, PY2);

end;

end;

procedure TGraphikFm.DrawFizPnt(X, Y: Double);

var

PX,PY: Integer;

LinePntSize : Integer;

begin

LinePntSize := GrProp.PointSize;

PX := GrToScrX(X);

PY := GrToScrY(Y);

with VectGraphPB.Canvas do begin

Ellipse(PX-LinePntSize, PY-LinePntSize, PX+LinePntSize, PY+LinePntSize);

MoveTo(PX, PY-LinePntSize);

LineTo(PX, PY+LinePntSize);

MoveTo(PX-LinePntSize, PY);

LineTo(PX+LinePntSize, PY);

end;

end;

function TGraphikFm.GrToScrX(V: Double): Integer;

begin

Result := Round(ScaleX*(V-R.MinX))+GrProp.LeftOff;

end;

function TGraphikFm.GrToScrY(V: Double): Integer;

begin

Result := Round(ScaleY*(R.MaxY-V))+GrProp.TopOff;

end;

procedure TGraphikFm.PaintBox1Paint(Sender: TObject);

var

T,Y: Integer;

begin

T:=90;

Y := 18;

PaintBox1.Canvas.Pen.Width := 2;

if GrProp.Line1Caption <> '' then

with PaintBox1.Canvas do begin

PaintBox1.Canvas.Pen.Color := GrProp.Line1Color;

MoveTo(T, Y);

T := T+20;

LineTo(T, Y);

T := T+10;

TextOut(T,Y-7,GrProp.Line1Caption);

end;

if GrProp.Line2Caption <> '' then

with PaintBox1.Canvas do begin

PaintBox1.Canvas.Pen.Color := GrProp.Line2Color;

T := T+50;

MoveTo(T, Y);

T := T+20;

LineTo(T, Y);

T := T+10;

TextOut(T,Y-7,GrProp.Line2Caption);

end;

if GrProp.Line3Caption <> '' then

with PaintBox1.Canvas do begin

PaintBox1.Canvas.Pen.Color := GrProp.Line3Color;

T := T+50;

MoveTo(T, Y);

T := T+20;

LineTo(T, Y);

T := T+10;

TextOut(t,Y-7,GrProp.Line3Caption);

end;

if GrProp.Line4Caption <> '' then

with PaintBox1.Canvas do begin

PaintBox1.Canvas.Pen.Color := GrProp.Line4Color;

T := T+50;

MoveTo(T, Y);

T := T+20;

LineTo(T, Y);

T := T+10;

TextOut(T,Y-7,GrProp.Line4Caption);

end;

end;

procedure TGraphikFm.VectGraphPBPaint(Sender: TObject);

var

I,tmp : Integer;

Vt,dt : Double;

StrT : string;

Xt,Yt : Integer;

begin

if PaintLock then Exit;

VectGraphPB.Canvas.Font.Size := GrProp.GridTextSize;

dt := (R.MaxX-R.MinX)/R.NX;

Vt := R.MinX;

for I := 0 to R.NX do begin

VectGraphPB.Canvas.Pen.Color := GrProp.GridColor;

DrawFizLine(VectGraphPB.Canvas,Vt,R.MinY,Vt,R.MaxY);

StrT := FloatToStrF(Vt,ffFixed,8,GrProp.GridDigitsX);

Xt := GrToScrX(Vt) - VectGraphPB.Canvas.TextWidth(StrT) div 2;

Yt := GrToScrY(R.MinY)+ GrProp.GridTextOff;

VectGraphPB.Canvas.Pen.Color := GrProp.TextColor;

VectGraphPB.Canvas.TextOut(Xt,Yt,StrT);

Vt := Vt + dt;

end;

dt := (R.MaxY-R.MinY)/R.NY;

Vt := R.MinY;

for I := 0 to R.NX do begin

VectGraphPB.Canvas.Pen.Color := GrProp.GridColor;

DrawFizLine(VectGraphPB.Canvas,R.MinX, Vt, R.MaxX,Vt);

StrT := FloatToStrF(Vt,ffFixed,8,GrProp.GridDigitsY);

Xt := GrToScrX(R.MinX) - GrProp.GridTextOff - VectGraphPB.Canvas.TextWidth(StrT);

Yt := GrToScrY(Vt)- VectGraphPB.Canvas.TextHeight(StrT) div 2;

VectGraphPB.Canvas.Pen.Color := GrProp.TextColor;

VectGraphPB.Canvas.TextOut(Xt,Yt,StrT);

Vt := Vt + dt;

end;

VectGraphPB.Canvas.Pen.Color := GrProp.Line1Color;

for I := 1 to VN1-1 do

DrawFizLine(VectGraphPB.Canvas,Vx1[I],Vy1[I],Vx1[I+1],Vy1[I+1]);

VectGraphPB.Canvas.Pen.Color := GrProp.Line2Color;

for I := 1 to VN2-1 do

DrawFizLine(VectGraphPB.Canvas,Vx2[I],Vy2[I],Vx2[I+1],Vy2[I+1]);

VectGraphPB.Canvas.Pen.Color := GrProp.Line3Color;

for I := 1 to VN3-1 do

DrawFizLine(VectGraphPB.Canvas,Vx3[I],Vy3[I],Vx3[I+1],Vy3[I+1]);

VectGraphPB.Canvas.Pen.Color := GrProp.Line4Color;

for I := 1 to VN4-1 do

DrawFizLine(VectGraphPB.Canvas,Vx4[I],Vy4[I],Vx4[I+1],Vy4[I+1]);

VectGraphPB.Canvas.Pen.Color := GrProp.Point1Color;

for I := 1 to VN1 do

DrawFizPnt(Vx1[I],Vy1[I]);

VectGraphPB.Canvas.Pen.Color := GrProp.Point2Color;

for I := 1 to VN2 do

DrawFizPnt(Vx2[I],Vy2[I]);

VectGraphPB.Canvas.Pen.Color := GrProp.Point3Color;

for I := 1 to VN3 do

DrawFizPnt(Vx3[I],Vy3[I]);

VectGraphPB.Canvas.Pen.Color := GrProp.Point4Color;

for I := 1 to VN4 do

DrawFizPnt(Vx4[I],Vy4[I]);

tmp := VectGraphPB.Canvas.Pen.Width;

VectGraphPB.Canvas.Pen.Width := 2;

VectGraphPB.Canvas.Pen.Color := clBlack;

DrawFizLine(VectGraphPB.Canvas,R.MinX, R.MinX, R.MaxX,R.MinX);

DrawFizLine(VectGraphPB.Canvas,R.MinX, R.MinY, R.MinX,R.MaxY);

VectGraphPB.Canvas.Pen.Width := tmp;

end;

procedure TGraphikFm.FormResize(Sender: TObject);

begin

PaintLock := True;

ScaleX := (VectGraphPB.Width-GrProp.LeftOff-GrProp.RightOff)/(R.MaxX-R.MinX);

ScaleY:= (VectGraphPB.Height-GrProp.TopOff-GrProp.BottomOff)/(R.MaxY-R.MinY);;

PaintLock := False;

end;

initialization

LoadProp(GetCurrentDir+'\Graphic.ini');

GrProp.Caption := '';

end.

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.