Смекни!
smekni.com

Программа вычисления значения и вывода графика определенного интеграла (стр. 7 из 7)

Рисунок 18 - Построение графика интеграла

Рисунок 19 - Примеры расчета интегралов


Рисунок 20 - Тестовый вызов исключительной ситуации

Рисунок 21 - Тестовый вызов API-функции GetSystemInfo

Для проверки правильности выполненных расчетов интегралов, представленных на рисунке 19, и отображения графика первого интеграла с переменным верхним пределом приведем пример вычисления интеграла и расчета графика выполненных в программе MathcadProfessional 2000, представленном на рисунке 22.


Рисунок 22 - Решение задачи в Mathcad

Как видно из рисунка, значения интегралов рассчитанных в разрабатываемой программе и в программе MathcadProfessional 2000 практически сходятся, что говорит правильности решения поставленной задачи.


5. ОПИСАНИЕ РАЗРАБОТКИ СПРАВОЧНОЙ СИСТЕМЫ

Для создания справочной системы я использовал программу DotCHM. Эта программа на лету создает справочные системы нескольких стандартов: 16-разрядная справка, 32-разрядная справка, chm-справка и справка для WindowsCE. В DotCHMможно создавать полностью рабочий справочный файл, с поиском, обзором и содержанием, за считанные минуты. Все, что требуется это набрать текст справки.

Создав новый проект справочной системы, создаю стандартное содержание. Затем создаю список разбиений справки на пункты, заполняю эти пункты, добавляю нужные изображения, ссылки и т.д. Связываю все разделы с содержанием и компилирую.

Рисунок 23 – Пример вызова справки

ЗАКЛЮЧЕНИЕ

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

При разработке данной программы были приобретены навыки:

- разработки программ в среде программирования Delphi

- использования методики смешанного программирования

- использования динамической компоновки dll-библиотек

- программной реализации численных методов для вычисления определенных интегралов

- написания 16-ти разрядного Help-а под Windows

ПЕРЕЧЕНЬ ССЫЛОК

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

2. Стив Т., Ксавье П. Delphi6 руководство разработчика.-М.: Вильямс, 2005г.- 1112с.

3. Дан Эпплман. Win32 API и VisualBasic для профессионалов.-М.: Питер, 2001г.- 1256с.


ПРИЛОЖЕНИЕ А

Листинг dll-библиотеки integrals.dll

libraryintegrals;

uses

SysUtils,

Classes;

{$R *.res}

type

IntegralFunction= function (x: real; var y: real): boolean;

function Simpson(MainFunction: IntegralFunction;a,b:real;n: integer; var Res: real): boolean;

var

s, h, x,y: real;

i: integer;

begin

Result:=true;

try

s:=0;

h:=(b-a)/n;

for i:=0 to n do

begin

x:=a+h*i;

if (i=0) or (i=n) then if MainFunction(x,y) then s:=s+y else Result:=false else

if i mod 2 = 0 then if MainFunction(x,y) then s:=s+2*y else Result:=false else

if MainFunction(x,y) then s:=s+4*y else Result:=false;

end;

except

Simpson:=false;

end;

Res:=s*h/3;

end;

function CountTrap(MainFunction: IntegralFunction; a,b, eps: real; var Res: real): boolean;

function PTrap(MainFunction: IntegralFunction; a,b:real; DivNo: Integer; var Res: real): boolean;

var

x1, x2,y1,y2,y3,dx,sum: real;

i: integer;

begin

PTrap:=true;

try

sum:=0;

dx:=(b-a)/DivNo;

for i:=1 to DivNo-1 do

begin

x1:=a+dx*i;

if MainFunction(x1,y1) then sum:=sum+y1 else Raise EAbort.Create('');

end;

sum:=sum*2;

if MainFunction(a,y1) and MainFunction(b,y2) then

sum:=sum+y1+y2 else Raise EAbort.Create('');

Res:=sum*dx/2;

except

PTrap:=False;

end;

end;

{-----}

var

T: integer;

i1, i2: real;

begin

countTrap:=true;

try

if PTrap(MainFunction,a,b,2,i1) and PTrap(MainFunction,a,b,4,i2) then

begin

T:=4;

while abs(i1-i2)>eps do

begin

if PTrap(MainFunction,a,b,t,i1) and PTrap(MainFunction,a,b,t*2,i2) then t:=t*2

else EAbort.Create('');

T:=T*2;

end;

end else EAbort.Create('');

Res:=(i1+i2)/2;

except

CountTrap:=false;

end;

end;

exports Simpson index 1;

exports CountTrap index 2;

begin

end.

ПРИЛОЖЕНИЕБ

Листинг dll-библиотеки functions.dll

library functions;

uses

SysUtils,

Classes;

{$R *.res}

function Integral1Function(x: real; var y: real):boolean;

begin

Result:=true;

try

y:=1/sqrt(2+0.5*x*x)

except

result:=false;

end;

end;

function Integral2Function(x: real; var y: real):boolean;

begin

Result:=true;

try

y:=sin(2*x)/sqr(x)

except

result:=false;

end;

exports Integral1Function;

exports Integral2Function;

begin

end.


ПРИЛОЖЕНИЕ В

Листинг модуля chart.pas

unit Chart;

interface

uses Graphics, SysUtils, Classes;

const

BorderTop=10;

BorderBottom=40;

BorderLeft=40;

BorderRight=10;

type

GraphFunction = function(x: real; var y: real): boolean;

TChartFunction = class

private

MainFunction: GraphFunction;

FColor: TColor;

FShow: boolean;

public

constructor Create(f: GraphFunction);

published

property Color: TColor read FColor write FColor;

property Show: boolean read FShow write FShow;

end;

TChart = class

private

functions: TStringList;

ChartBitmap: TBitmap;

MainCanvas: TCanvas;

bgBrush: TBrush;

gridPen: TPen;

AxisPen: TPen;

Width: integer;

Height: integer;

FScale: real;

FStep: real;

FShowGrid: boolean;

xx0, yy0: integer;

nsteps: integer;

x0, y0: integer;

procedure DrawGrid;

procedure DrawFunction(funct: TChartFunction);

procedure DrawFunctions;

procedure PutPixel(x,y: integer; Color: TColor);

procedure OutTextCenter(s: string; x, y: integer);

public

constructor Create(Canvas: TCanvas);

procedure AddFunction(f: TChartFunction; Ident: String);

function DelFunction(s: string): boolean;

procedure ReDraw;

procedure ShiftHor(value: integer);

procedure ShiftVer(value: integer);

procedure Rescale(xvalue, yvalue: integer; Maximize: boolean);

procedure GetXY(x,y: integer; var x1,y1: real);

procedure SaveToFile(filename: string);

published

property ShowGrid: boolean read FShowGrid write FShowGrid;

end;

implementation

{ TChart }

constructor TChart.Create(Canvas: TCanvas);

begin

functions:=TStringList.Create;

MainCanvas:=Canvas;

ChartBitmap:=TBitmap.Create;

bgBrush:=TBrush.Create;

bgBrush.Color:=clWhite;

gridPen:=TPen.Create;

gridPen.Style:=psDot;

AxisPen:=TPen.Create;

AxisPen.Width:=2;

AxisPen.Style:=psInsideFrame;

AxisPen.Color:=clRed;

Width:=MainCanvas.ClipRect.Right-MainCanvas.ClipRect.Left;

Height:=MainCanvas.ClipRect.Bottom-MainCanvas.ClipRect.Top;

ChartBitmap.Width:=Width;

ChartBitmap.Height:=Height;

FShowGrid:=true;

xx0:=40+trunc((width-50)/2);

yy0:=10+trunc((height-50)/2);

x0:=xx0;

y0:=yy0;

NSteps:=20;

FScale:=20;

FStep:=(width/fscale)/nsteps;

ReDraw;

end;

procedure TChart.DrawFunction(funct: TChartFunction);

var

x, y: real;

x1,y1,x2,y2: integer;

a,b: boolean;

f: GraphFunction;

begin

x:=-(x0/FScale);

a:=false;

f:=funct.MainFunction;

while (x0+x*FScale)<(Width-BorderRight) do

begin

if f(x,y) then

begin

x1:=round(x0+x*FScale);

y1:=round(y0-y*FScale);

if (x1>BorderLeft) and (x1<width-BorderRight) and (y1>BorderTop) and (y1<height-BorderBottom) then

begin

PutPixel(x1,y1, funct.Color);

end;

end;

x:=x+0.01;

end;

end;

procedure TChart.OutTextCenter(s: string; x, y: integer);

begin

x:=x-round(MainCanvas.TextWidth(s)/2);

y:=y-round(MainCanvas.TextHeight(s)/2);

MainCanvas.TextOut(x,y,s);

end;

procedure TChart.DrawGrid;

var

x, y: integer;

k: real;

s: string;

begin

With MainCanvas do begin

Brush.Assign(bgBrush);

FillRect(ClipRect);

begin

if FShowGrid then

Pen.Assign(GridPen) else Pen.Style:=psClear;;

x:=x0 mod trunc(FScale*FStep);

while x<(width-BorderRight) do

end;

procedure TChart.ReDraw;

begin

DrawGrid;

DrawFunctions;

end;

procedure TChart.ShiftHor(value: integer);

begin

x0:=x0+value;

ReDraw;

end;

procedure TChart.ShiftVer(value: integer);

begin

y0:=y0+value;

ReDraw;

end;

procedure TChart.AddFunction(f: TChartFunction; Ident: String);

begin

functions.AddObject(Ident,f);

ReDraw;

end;

procedure TChart.DrawFunctions;

var

i: integer;

begin

for i:=0 to functions.Count-1 do

if TChartFunction(functions.Objects[i]).Show then

DrawFunction(TChartFunction(functions.Objects[i]));

end;

begin

if x>BorderLeft then

begin

MoveTo(x,BorderTop); LineTo(x, Height-BorderBottom);

k:=(x-x0)/FScale;

s:= FloatToStrF(k,ffGeneral,4,2);

OutTextCenter(s, x, height-round(BorderBottom/2));

end;

x:=x+trunc(FStep*FScale);

end;

y:=y0 mod trunc(FScale*FStep);

while y<(height-BorderBottom) do

begin

if y>BorderTop then

begin

MoveTo(BorderLeft,y); LineTo(Width-BorderRight, y);

k:=(y0-y)/FScale;

s:= FloatToStrF(k,ffGeneral,4,2);

OutTextCenter(s,round(BorderLeft/2), y);

end;

y:=y+trunc(FStep*FScale);

end;

end;

// юЄЁшёютър ъююЁфшэрЄэ√ї юёхщ

Pen.Assign(AxisPen);

if (x0>BorderLeft) and (x0<(width-BorderRight)) then

begin

MoveTo(x0, BorderTop); lineto(x0, height-BorderBottom-1);

end;

if (y0>BorderTop) and (y0<(Height-BorderBottom)) then

begin

Moveto(BorderLeft,y0); lineTo(width-BorderRight-1, y0);

end;

Pen.Assign(gridPen);

Pen.Style:=psSolid;

Brush.Style:=bsClear;

Rectangle(40, 10, Width-10, height-40);

Brush.Style:=bsSolid;

end;

end;

procedure TChart.PutPixel(x, y: integer; Color: TColor);

var

i, j: integer;

begin

with MainCanvas do

for i:=x to x+1 do

for j:=y to y+1 do

MainCanvas.Pixels[i,j]:=Color;

function TChart.DelFunction(s: string): boolean;

label 1;

var

i: integer;

begin

result:=false;

for i:=0 to functions.Count-1 do

if functions.Strings[i]=s then

begin

result:=true;

functions.Delete(i);

goto 1;

end;

1:

end;

procedure TChart.Rescale(xvalue, yvalue: integer; Maximize: boolean);

var

mx, my: Real;

begin

if xvalue*yvalue<>0 then begin

mx:=(width-borderleft-borderright)/xvalue;

my:=(height-bordertop-borderbottom)/yvalue;

if Maximize then

if mx<my then FScale:=FScale*mx else FScale:=FScale*my

else

if mx<my then FScale:=FScale/mx else FScale:=FScale/my;

FStep:=(width/FScale)/NSteps;

ReDraw; end;

end;

procedure TChart.GetXY(x, y: integer; var x1, y1: real);

begin

x1:=(x-x0)/FScale;

y1:=(y0-y)/FScale;

end;

procedure TChart.SaveToFile(filename: string);

var

temporary: TPicture;

begin

temporary:=TPicture.Create;

temporary.Bitmap.Width:=width;

temporary.Bitmap.Height:=height;

Temporary.Bitmap.Canvas.CopyRect( Temporary.Bitmap.Canvas.ClipRect, MainCanvas, MainCanvas.ClipRect);

Temporary.SaveToFile(filename);

temporary.Destroy;

end;

{ TChartFunction }

constructor TChartFunction.Create(f: GraphFunction);

begin

MainFunction:=f;

Show:=true;end;end.