Рисунок 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.