Алгоритм побудови графіка функції двох змінних

Графік функції двох змінних Графік функції двох змінних можна собі уявляти у вигляді деякої поверхні в тривимірному просторі. Для наочного зображення поверхні будемо використовувати наступний алгоритм: проведемо в просторі площину grafik_funkcii_3d4, паралельну осям grafik_funkcii_3d5 і grafik_funkcii_3d6. Тоді перетин даної площини з поверхнею функції є деяка крива — графік функції однієї змінної grafik_funkcii_3d7. (правда, розташований цей графік під певним кутом до площини екрану). Змінюючи значення константи з деяким кроком, ми отримаємо сімейство таких кривих.

Графік функції 3D

Графічне представлення алгоритму побудови графіка функції двох змінних

Наступним кроком алгоритму є побудова другого сімейства кривих, кожна з яких буде перетином поверхні площиною grafik_funkcii_3d8. Накладення сімейства таких кривих дають хороше уявлення про поверхню граіка вихідеої функції.

Графік функції 3D

Графічне представлення алгоритму побудови графіка функції двох змінних

Отже, давайте спробуємо застосувати даний алгоритм для конкретного прикладу. Для цього, запустимо середовище програмування delphi і створимо новий проект. Значення властивостей ширини (Width) і висоти (Height) головної форми Form1 встановимо рівним 529 та 534 відповідно. Після цього, розмістимо в нижній частині форми компонент типу TButton, при натисканні на який буде здійснюватись побудова графіка, і встановимо для даної кнопки значення властивості Caption рівним «Побудувати графік функції двох змінних».

Далі переходимо до обробника події OnClick компонента Button1, і в тілі процедури Button1Click, в першу чергу, визначемо область форми Form1, призначену для виводу графіка та намалюємо осі координат grafik_funkcii_3d9.

Алгоритм побудови осей координат X,Y,Z

Алгоритм побудови осей координат X,Y,Z

procedure TForm1.Button1Click(Sender: TObject);
var
i, j, x0, y0, n: integer;
S, my, mz, mq1, mq2, xmin, ymin, xmax, ymax, zmin, zmax, hx, hy, xx, yy: real;
O, X, Xr, Y, Z: array[1..2] of integer;
XXX, YYY, ZZZ: array[1..1000] of real;
R_matr: array[1..2, 1..2] of real;
begin
// Область виводу графіка
Form1.Canvas.Brush.Color := clWhite;
Form1.Canvas.Rectangle(10, 20, 510, 470);
// Координати центрк системи ккординат
x0 := 510 div 2;
y0 := 470 div 2;
// Координати точки O
O[1] := x0; O[2] := y0;
// Координати точки Y
Y[1] := 500; Y[2] := y0;
// Координати точки Z
Z[1] := x0; Z[2] := 30;
// Координати точки X
X[1] := 20; X[2] := y0;
// Малюємо вісь OZ
Form1.Canvas.MoveTo(Trunc(O[1]), Trunc(O[2]));
Form1.Canvas.LineTo(Trunc(Z[1]), Trunc(Z[2]));
// Малюємо вісь OY
Form1.Canvas.MoveTo(Trunc(O[1]), Trunc(O[2]));
Form1.Canvas.LineTo(Trunc(Y[1]), Trunc(Y[2]));
// Заповнюємо елементи матриці обертання відповідними елементами
R_matr[1, 1] := Cos(45 * (Pi/180)); R_matr[1, 2] := Sin(45 * (Pi/180));
R_matr[2, 1] := -Sin(45 * (Pi/180)); R_matr[1, 2] := Cos(45 * (Pi/180));
// Переносимо точку X в центр обертання O
for j := 1 to 2do
Xr[j] := X[j] — O[j];
// Виконуємо поворот точки X на 45 градусів
for i := 1 to 2 do
begin
S := 0;
for j := 1 to 2 do
S := S + Xr[j] * R_matr[i ,j];
Xr[i] := Round(S);
end;
// Повертаємо точку X у вихідне положення (на малюнку точка Xr)
for j := 1 to 2 do
Xr[j] := O[j] + Xr[j];
// Маліюмо вісь X
Form1.Canvas.MoveTo(x0, y0);
Form1.Canvas.LineTo(Trunc(Xr[1]), Trunc(Xr[2]));

Після того, як система координат готова, переходимо до побудови графіка функції двох змінних. На першому кроці, будемо здійснювати побудову сімейства кривих (являються графіком функції однієї змінної), в площинах grafik_funkcii_3d8, паралельних осям grafik_funkcii_3d11 та grafik_funkcii_3d6. Детально описувати процес побудови графіка функції однієї змінної ми не будемо, його можна знайти за посиланням Алгоритм побудови графіка функції однієї змінної, а перейдемо до обробника події OnClick кнопки Button1 і доповнимо його наступним кодом.

// Мінімальні і максимальні значення аргументів та функції
xmin := 0; ymin := 0; zmin := 0;
xmax := 4; ymax := 4; zmax := 4;
// Кількість точок графіка
n := 30;
// Масштаб по осі OY
my := (Y[1] — O[1])/(ymax — ymin);
// Масштаб по осі OZ
mz := (O[2] — Z[2])/(zmax — zmin);
// Параметри зміщення графіка по осі OX
mq1 := (O[1] — Xr[1])/n;
mq2 := (Xr[2] — O[2])/n;
// Крок зміни X
hx := (xmax — xmin)/n;
// Крок зміни Y
hy := (ymax — ymin)/n;
Form1.Canvas.Pen.Color := clRed;
xx := xmin;
Xr := O;
while (xx <= xmax) do
begin
i := 0;
yy := ymin;
// Малюємо сімейство кривих паралельних осям OX, OZ
while (yy <= ymax) do
begin
i := i + 1;
YYY[i] := yy;
ZZZ[i] := Sin(xx * yy);
yy := yy + hy;
end;
for j := 1 to i-1 do
begin
Form1.Canvas.MoveTo(Trunc(Xr[1] + YYY[j]*my), Trunc(Xr[2] — ZZZ[j]*mz));
Form1.Canvas.LineTo(Trunc(Xr[1] + YYY[j + 1]*my), Trunc(Xr[2] — ZZZ[j + 1]*mz));
end;
xx := xx + hx;
Xr[1] := Xr[1] — mq1; Xr[2] := Xr[2] + mq2;
end;

Запустивши проект на виконання і натисшувши кнопку «Побудувати графік функції двох змінних», отримаємо:

Інтерфейс delphi-проекту "Графік функції двох змінних"

Інтерфейс delphi-проекту "Графік функції двох змінних"

Далі, аналогічним чином,  побудувавши сімейство кривих в площинах grafik_funkcii_3d4, отримуємо поверхню граіка вихідеої функції.

// Масштаб по осі OX
mxx := (O[1] — Xr[1])/(xmax — xmin);
yy := ymin;
Xr := O;
// Малюємо сімейство кривих паралельних осям OY, OZ
while (yy <= ymax) do
begin
i := 0;
xx := xmin;
while (xx <= xmax) do
begin
i := i + 1;
XXX[i] := xx;
ZZZ[i] := Sin(xx * yy);
xx := xx + hx;
end;
for j := 1 to i-1 do
begin
Form1.Canvas.MoveTo(Trunc(Xr[1] — XXX[j] * mxx), Trunc(Xr[2] — ZZZ[j] * mz + (j-1)*mq2));
Form1.Canvas.LineTo(Trunc(Xr[1] — XXX[j+1] * mxx), Trunc(Xr[2] — ZZZ[j+1] * mz + j*mq2));
end;
yy := yy + hy;
Xr[1] := Trunc(O[1] + yy*my); Xr[2] := O[2];
end;

grafik_funkcii_3d131

Інтерфейс delphi-проекту "Графік функції двох змінних"

Зауваження: при побудові осей координат, а саме grafik_funkcii_3d5, ми здійснювали поворот точки і використовували для цього матрицію обертання. Що таке матриця обертання, і для чого вона використовується можна знайти за посиланням Поворот точки на площині.

Скачати delphi-проект Графік функції двох змінних.

Матеріал був корисним, поділись в соціальних мережах:

Якщо тобі сподобалась дана тема, залиш свій коментар