Код:
// Функция, график которой надо построить
Function f(x:real):real;
begin
f:=power(-1,x-1)*power(x,-x);
end;
// строит график функции
procedure GrOfFunc;
var
l,b:integer; // левый нижний угол области вывода графика
w,h:integer; // ширина и высота области вывода графика
nfx1,nfx2:real; // границы изменения аргумента функции
nfy1,nfy2:real; // границы изменения значения функции
nfx:real; // аргумент функции
nfy:real; // значение функции в точке x
nfdx:real; // приращение аргумента
nfmx,nfmy:real; // масштаб по осям X и Y
nfx0,nfy0:integer; // точка - начало координат
begin
with Form2.Image1 do
begin
// область вывода графика
l:=10; // X - координата левого верхнего угла
b:=Height-20; // Y - координата левого верхнего угла
h:=Height-40; // высота
w:=Width-40; // ширина
nfx1:=1; // нижняя граница диапазона аргумента
nfx2:=5; // верхняя граница диапазона аргумента
nfdx:=1; // шаг аргумента
// найдем максимальное и минимальное значения
// функции на отрезке [x1,x2]
nfy1:=f(nfx1); // минимум
nfy2:=f(nfx1); // максимум
nfx:=nfx1;
repeat
nfy := f(nfx);
if nfy < nfy1 then nfy1:=nfy;
if nfy > nfy2 then nfy2:=nfy;
nfx:=nfx+nfdx;
until (nfx>=nfx2);
// вычислим масштаб
nfmy:=h/abs(nfy2-nfy1); // масштаб по оси Y
nfmx:=w/abs(nfx2-nfx1); // масштаб по оси X
// оси
nfx0:=l;
nfy0:=b-Abs(Round(nfy1*nfmy));
with Form2.Image1.Canvas do
begin
// оси
MoveTo(l,b);LineTo(l,b-h);
MoveTo(nfx0,nfy0);LineTo(nfx0+w,nfy0);
TextOut(l+5,b-h,FloatToStrF(nfy2,ffGeneral,6,3));
TextOut(l+5,b,FloatToStrF(nfy1,ffGeneral,6,3));
// построение графика
nfx:=nfx1;
repeat
nfy:=f(nfx);
Pixels[nfx0+Round(nfx*nfmx),nfy0-Round(nfy*nfmy)]:=clRed;
nfx:=nfx+nfdx;
until (nfx>=nfx2);
end;
end;
проблема заключается здесь
Код:
nfx1:=1; // нижняя граница диапазона аргумента
nfx2:=5; // верхняя граница диапазона аргумента
nfdx:=1; // шаг аргумента
Если так, то всё работает, если в функцию входят целые числа, но этого недостаточно, на канве будут просто отдельные пиксели. Как только изменить допустим шаг на
Код:
nfdx:=0,001; // шаг аргумента
, то в функцию войдёт значение вещественное и получается так, что в степени дробь.Дробь в степени - это корень и, соответственно, извлекается корень из отрицательного числа. Как менять? что править? переходить к комплексным числам - то как ?
Знак (минус на плюс и наоборот) меняется каждый раз, может можно сначала посчитать значение а потом определить знак ?