Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Санкт-Петербургский государственный университет
телекоммуникаций им. проф. М.А.Бонч-Бруевича
Кафедра АПС
Вычисление определенных интегралов
Пояснительная записка к курсовой работе по дисциплине «Информатика»
Работу выполнил студент группы ТСС-12
Чураков Александр Сергеевич
Работу проверил доцент кафедры АПС
Волынкин Павел Александрович
Санкт-Петербург, 2012 г.
Задача 3
Обзор методов решения 3
Алгоритм 6
Интерфейс 9
Код программы 9
Руководство пользователя 16
Вывод 16
Список используемой литературы 17
Приложение 1 18
Задача.
Рассчитать определенный интеграл функции с возможностью оперативно менять пределы интегрирования и точность расчета.
Обзор методов решения задачи.
Метод прямоугольников
Пусть требуется вычислить определенный интеграл , где функция f(x) непрерывна на отрезке [a,b]. Будем полагать, что на [a,b]. Это предположение не изменит формулы, но позволит прибегнуть к геометрической интерпретации результата: интеграл равен площади криволинейной трапеции, ограниченной графиком функции y = f(x), осью ОХ и прямыми x = a, x = b.
Разобьем отрезок [a,b] на n равных частей точками: . Обозначим длины частичных отрезков. По условию . Вычислим значения функции (ординаты) точек деления. Таким образом, исходная криволинейная трапеция разбита на n полос, которые также являются криволинейными трапециями. Площадь каждой такой трапеции будем считать приближенно равной площади прямоугольника, основание которого , а высота правая ордината полосы: . Сумма площадей всех полученных прямоугольников выражает площадь ступенчатой фигуры . С другой стороны, сумма S является интегральной для функции f(x) на отрезке [a,b], поэтому приближенно равна интегралу:
. (1)
Таким образом, площадь криволинейной трапеции аппроксимируется (приближается) площадью ступенчатой фигуры, состоящей из прямоугольников. Формула (1) называется формулой «правых» прямоугольников.
Аналогично, рассматривая в качестве высоты каждого прямоугольника левую ординату, можно получить формулу «левых» прямоугольников:
. (2)
Стр. 1
За высоту прямоугольника при разбиении можно взять любую точку на промежутке ,
например, середину этого отрезка. В этом случае формула приближенного вычисления принимает
вид: Величину h = называют шагом аппроксимации.
Ошибка вычисления будет тем меньше, чем больше число n, и для метода прямоугольников она будет иметь оценку , где М некоторая положительная константа.
Метод трапеций
Найдем среднее арифметическое выражений в формулах (1) и (2):
Каждое слагаемое в данной формуле представляет площадь трапеции с основаниями и , и высотой . Таким образом, площадь криволинейной трапеции аппроксимируется суммой площадей прямолинейных трапеций, и полученная формула:
(3)
называется формулой трапеций. Формулу трапеций также можно записать в виде:
. (4)
В формуле трапеций на каждом участке разбиения дуга графика функции y = f(x) замещается хордой. Ошибка вычисления оценивается аналогично предыдущему методу.
Метод Симпсона
Еще более точную формулу для вычислений можно получить, если на отдельных участках заменить кривую y=f(x) параболой.
Известно, что через три заданные точки, не лежащие на одной прямой, можно провести параболу единственным образом, поэтому отрезок интегрирования [a,b] надо разбить на n частей таким образом, чтобы полученные точки деления позволяли построить параболы. Очевидно, что число точек деления должно быть четным: n = 2m. Границами промежутков будут точки , а длина каждого промежутка равна . Пусть . Рассмотрим первые два промежутка деления. Функцию f(x) на отрезке заменим параболой, проходящей через точки . Будем искать уравнение параболы в виде многочлена второй степени.
. (5)
Неизвестные коэффициенты А, В, С найдем из условий . Подставим в формулу (5) значение , получим . Поскольку , то , откуда . Аналогично, при , получим и , а при найдем коэффициент . Заменив площадь криволинейной трапеции, ограниченной кривой y = f(x), на площадь криволинейной трапеции, ограниченной параболой, получим приближенную формулу:
Введем замену переменной ,тогда данный интеграл примет вид:
.
Воспользуемся найденными значениями для А, В, С и запишем:
. (6)
Теперь для всего промежутка [a,b] можно указать формулу приближенного вычисления:
или
. (7)
Формула (7) называется формулой Симпсона.
При разбиении промежутка на одно и то же число частей, формула Симпсона, как правило, дает более точное значение, чем формулы прямоугольников и трапеций. Ошибка вычисления для метода Симпсона имеет оценку , где М некоторая положительная константа.
Для использования в программе я выбрал метод трапеций, так как он обеспечивает большую точность и не так сложен, как метод Симпсона.
Алгоритм.
Для вычисления определенного интеграла, я разработал алгоритм на основе составной формулы трапеций.
Заданный отрезок AB разбивается на n частей. Для каждой трапеции вычисляется значение по данной формуле, сумма которых дает значение заданного интеграла.
Расчет интеграла.
Задаем значение функции ( func = power(abs(x),1/6)*(3*sin(3*x)*cos(2*x)+2*sin(2*x)*5*cos(3*x)) )
Начало
Принимаем от пользователя значения пределов интегрирования (a, b) и задаем количество участков разбиения (n).
От i = 1
До n-1
Шаг 1
Рассчитываем длину участка разбиения (h, (b-a)/n)
Рассчитываем конечный результат интегрирования
Result = h * ( ( func(a) + func(b) ) / 2 + S))
Конец
Рассчитываем площади трапеций (S; S+F(a+h*i))
Вывод графика.
Задаём начальные значения масштаба и расположение осей(X0,Y0,Kx,Ky)
Начало
Прорисовка и градуировка осей
Перемещаем перо на начальную позицию (0,Y0)
От Xg=0
До XgMAX
Шаг 1
Конец
Рассчитываем «математический x» ( x = (pXg-pX0) / pKx )
Рассчитываем «математический y» ( y = func(x) )
Рассчитываем «графический y» ( Yg = round( Y0 - y*Ky ) )
Проводим линию к следующей точке функции по её «графическим» координатам (Xg,Yg)
Расчет погрешности.
Начало
Принимаем от пользователя желаемое значение точности вычисления интеграла (e0)
Увеличиваем количество участков разбиения в 2 раза
Вычисляем значение определенного интеграла при разном количестве участков разбиения (I1 (n), I2 (n*2))
e<e0/100
нет
Вычисляем получившееся значение точности (e)
Конец
Выводим значение интеграла
да
Разработка интерфейса.
При разработке интерфейса данной программы использовалась стандартная схема расположения элементов на форме. Большую часть формы, ее левую часть, занимает компонент Image 1, предназначенный для вывода графика функции. В правой части формы расположены компоненты, через которых осуществляется навигация и масштабирование(6 компонентов TButton), а также компоненты для проведения интегрирования функции(3 компонента TEdit и компонент Button 8).
Текст программы.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Unit2, Unit3;
type
TForm1 = class(TForm)
Image1: TImage;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button8: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Button9: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
Button13: TButton;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Edit4: TEdit;
Label13: TLabel;
procedure Button2Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
procedure Button13Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Kx,Ky:real;
Xg0,Yg0,X0,Y0:integer;
Const
XgMAX=600;
YgMax=400;
implementation
{$R *.dfm}
{Прорисовка графика на Image1 при сосздании формы}
procedure TForm1.FormCreate(Sender: TObject);
var
Xg,Yg:integer;
begin
nP(X0,Y0,Kx,Ky); // задаёт начальные значения масштаба и расположение осей(Unit3)
osi(X0,Y0); // прорисовка и градуировка осей
Image1.Canvas.MoveTo(0,Y0); // начальная позиция пера
for Xg:=0 to XgMAX do // цикл по перебору аргумента
begin
graph(X0,Kx,Xg,Y0,Ky,Yg); //Рассчёт Yg (Unit3)
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
{функция интегрирования}
Function Integr(pa,pb:real; pn:integer):real;
var a,b,S,h:real;
n,i:integer;
begin
a:=pa;
b:=pb;
n:=pn;
S:=0;
h := (b - a) / n;
for i := 1 to n-1 do
begin
S := S + func(a + h * i);
end;
result := h * (( func(a) + func(b))/ 2 + S);
end;
{процедура рассчёта интеграла и вывода результата}
procedure TForm1.Button8Click(Sender: TObject);
var
a,b,e0,e,I1,I2:real;
n:integer;
sep:boolean;
begin
if DecimalSeparator = '.' then sep:=true else sep:=false;
Case sep of
true : if pos(',',edit1.Text+edit2.Text)<>0 then
begin
ShowMessage('Некорректный знак разделителя');
Exit;
end;
false : if pos('.',edit1.Text+edit2.Text)<>0 then
begin
ShowMessage('Некорректный знак разделителя');
Exit;
end;
end;
a:=StrToFloat(edit1.Text);
b:=StrToFloat(edit2.Text);
e0:=strtofloat(edit4.Text);
n:=25;
repeat
n:=n*2;
I1:=integr(a,b,n);
I2:=integr(a,b,n*2);
e:=2*(I2-I1)/(I1+I2);
until
e<=e0/100;
Label12.caption:=floattostr(I1);
end;
{+масштаб по Х}
procedure TForm1.Button2Click(Sender: TObject);
var
Xg,Yg:integer;
Begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Kx:=Kx*1.618;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
{-масштаб по Х}
procedure TForm1.Button5Click(Sender: TObject);
var
Xg,Yg:integer;
Begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Kx:=Kx/1.618;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
{+масштаб по Y}
procedure TForm1.Button4Click(Sender: TObject);
var
Xg,Yg:integer;
Begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Ky:=Ky*1.618;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
{-масштаб по Y}
procedure TForm1.Button3Click(Sender: TObject);
var
Xg,Yg:integer;
Begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Ky:=Ky/1.618;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
{+отступление оси OY вправо}
procedure TForm1.Button6Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
X0:=X0+200;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
{+отступление оси OY влево}
procedure TForm1.Button10Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
X0:=X0-200;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
{+отступление оси OX вверх}
procedure TForm1.Button11Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Y0:=Y0+200;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
{+отступление оси OX вниз}
procedure TForm1.Button9Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Y0:=Y0-200;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
{стандартное значение масштаба}
procedure TForm1.Button12Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
nP(X0,Y0,Kx,Ky);
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
{стандартное расположение осей}
procedure TForm1.Button13Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
nP(X0,Y0,Kx,Ky);
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
end.
Руководство пользователя.
Данная программа позволяет вычислять определённый интеграл от рассматриваемой функции f(x) с задаваемыми пользователем пределами и точностью расчета, а также предоставляет пользователю график данной функции.
Вывод графика функции происходит автоматически в область формы (1).
Для масштабирования графика следует использовать группу кнопок «Масштабирование» в области формы (2):
две кнопки, расположенные на « горизонтальной оси» (-, +) уменьшают и увеличивают изображение в горизонтальной плоскости;
две кнопки, расположенные на «вертикальной оси» (-, +) уменьшают и увеличивают изображение в вертикальной плоскости;
кнопка «Станд» возвращает масштаб графика к первоначальному виду.
Для навигации по графику следует использовать группу кнопок «Навигация» в области формы (3):
кнопка «вверх» - смещает график вверх по оси Y;
кнопка «вниз» - смещает график вниз по оси Y;
кнопка «влево» - смещает график влево по оси X;
кнопка «вправо» - смещает график вправо по оси X;
кнопка «Станд» возвращает график в начальное положение.
Для расчета определенного интеграла данной функции следует провести следующую последовательность действий:
Вывод.
В данном курсовом проекте я научился создавать программу на языке программирования DELPHI. Провел работу по алгоритмизации и оптимизации выбранного мной метода вычисления определенного интеграла. Создал относительно точную программу для вычисления определенного интеграла данной функции с возможностью менять пределы интегрирования и точность расчета.
Список используемой литературы.
«БХВ-Петербург» 2011г.
Санкт-Петербургский Государственный Университет Телекоммуникаций Им. Проф. М.А. Бонч-Бруевича, кафедра АПС 2007г.
Приложение 1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Unit2, Unit3;
type
TForm1 = class(TForm)
Image1: TImage;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button8: TButton;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Button9: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
Button13: TButton;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Edit4: TEdit;
Label13: TLabel;
procedure Button2Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
procedure Button13Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Kx,Ky:real;
Xg0,Yg0,X0,Y0:integer;
Const
XgMAX=600;
YgMax=400;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
Xg,Yg:integer;
begin
nP(X0,Y0,Kx,Ky);
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
Function Integr(pa,pb:real; pn:integer):real;
var a,b,S,h:real;
n,i:integer;
begin
a:=pa;
b:=pb;
n:=pn;
S:=0;
h := (b - a) / n;
for i := 1 to n-1 do
begin
S := S + func(a + h * i);
end;
result := h * (( func(a) + func(b))/ 2 + S);
end;
procedure TForm1.Button8Click(Sender: TObject);
var
a,b,e0,e,I1,I2:real;
n:integer;
sep:boolean;
begin
if DecimalSeparator = '.' then sep:=true else sep:=false;
Case sep of
true : if pos(',',edit1.Text+edit2.Text)<>0 then
begin
ShowMessage('Некорректный знак разделителя');
Exit;
end;
false : if pos('.',edit1.Text+edit2.Text)<>0 then
begin
ShowMessage('Некорректный знак разделителя');
Exit;
end;
end;
a:=StrToFloat(edit1.Text);
b:=StrToFloat(edit2.Text);
e0:=strtofloat(edit4.Text);
n:=25;
repeat
n:=n*2;
I1:=integr(a,b,n);
I2:=integr(a,b,n*2);
e:=2*(I2-I1)/(I1+I2);
until
e<=e0/100;
Label12.caption:=floattostr(I1);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Xg,Yg:integer;
Begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Kx:=Kx*1.618;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
Xg,Yg:integer;
Begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Kx:=Kx/1.618;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
Xg,Yg:integer;
Begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Ky:=Ky*1.618;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
Xg,Yg:integer;
Begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Ky:=Ky/1.618;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
X0:=X0+200;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
procedure TForm1.Button10Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
X0:=X0-200;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
procedure TForm1.Button11Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Y0:=Y0+200;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
{+отступление оси OX вниз}
procedure TForm1.Button9Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
Y0:=Y0-200;
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
procedure TForm1.Button12Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
nP(X0,Y0,Kx,Ky);
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
procedure TForm1.Button13Click(Sender: TObject);
var
Xg,Yg:integer;
begin
Image1.Canvas.FillRect(Bounds(0,0,600,400));
nP(X0,Y0,Kx,Ky);
osi(X0,Y0);
Image1.Canvas.MoveTo(0,Y0);
for Xg:=0 to XgMAX do
begin
graph(X0,Kx,Xg,Y0,Ky,Yg);
Image1.Canvas.LineTo(Xg,Yg);
end;
end;
end.
unit Unit2;
interface
uses math;
function Func(x:real):real;
implementation
function Func(x:real):real;
Begin
result:=power(abs(x),1/6)*(3*sin(3*x)*cos(2*x)+2*sin(2*x)*5*cos(3*x));
End;
end.
unit Unit3;
interface
Uses Unit2;
procedure graph(pX0:integer; pKx:real; pXg:integer;
pY0:integer; pKy:real; var pYg:integer);
procedure nP(var pX0,PY0:Integer; var PkX,PkY:real);
procedure osi(pX0,PY0:integer);
implementation
Uses Unit1;
procedure osi(pX0,PY0:integer);
var i,l,m: integer;
begin
Form1.Image1.Canvas.MoveTo(0,pY0);
Form1.Image1.Canvas.LineTo(600,pY0);
Form1.Image1.Canvas.MoveTo(pX0,0);
Form1.Image1.Canvas.LineTo(pX0,400);
m:=XgMAX div 2;
l:=YgMAX div 2;
for i:=1 to 70 do
begin
form1.Image1.Canvas.MoveTo(i*10,l+5);
form1.Image1.Canvas.LineTo(i*10,l-5);
form1.Image1.Canvas.MoveTo(m-5,i*10);
form1.Image1.Canvas.LineTo(m+5,i*10);
end;
end;
procedure graph(pX0:integer; pKx:real; pXg:integer;
pY0:integer; pKy:real; var pYg:integer);
var
x,y:real;
begin
x:=(pXg-pX0)/pKx;
y:=func(x); //Рассчёт значения F(x) (Unit2)
pYg:=round(pY0-y*pKy);
end;
procedure nP(var pX0,PY0:Integer; var PkX,PkY:real);
begin
pX0:=300;
pY0:=200;
pKx:=10;
pKy:=10;
end;
end.