Помощь - Поиск - Пользователи - Календарь
Полная версия: Табулирование функции
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Василяй
Помогите разобраться в задаче!
Задание такое: Затабулировать функцию двух переменных z(x,y)=sqrt(1-sqr(x)-sqr(y)) внутри квадрата 0<=x, y<=1 (<= - меньше или равно) и области существования функции z. Шаги табуляции х=у=0.1

Я задачю решил (вроде бы smile.gif ). Мне не понятно как затабулировать функцию в области существования функции z. Помогите с этим пожайлуста! Вот моя программа:
uses crt;
const shag = 0.1;
var
x,y,z: real ;
count : integer ;

function func(x,y:real ):real;
var
z: real;
begin
z:=0;
begin
z:=sqrt(1-sqr(x)-sqr(y));
end;
func:=z;
end;

begin
clrscr;
count := 1;
x := 0;
y := 1;
While x <= y do
begin
writeln(count,')','x=',x,' y=',y,' z(x,y)=',func(x,y));
x:= x+shag;
y:= y-shag;
inc(count);
end;
end.
мисс_граффити
function func(x,y:real ):real;
var
z: real;
begin
z:=0;
begin
z:=sqrt(1-sqr(x)-sqr(y));
end;
func:=z;
end;

а нельзя так:
function func(x,y:real ):real;
begin
func:=sqrt(1-sqr(x)-sqr(y));
end;


?
Цитата
While x <= y do

вот это условие откуда берется?
по заданию оно должно быть таким:
0<=x<=1
0<=y<=1
но дело в том, что не на всем квадрате функция sqrt(1-sqr(x)-sqr(y)) определена (корень из отрицательного числа в области действительных чисел извлечь невозможно).
Василяй
Цитата(мисс_граффити @ 17.06.2007 20:35) *

а нельзя так:

function func(x,y:real ):real;
begin
func:=sqrt(1-sqr(x)-sqr(y));
end;


можно yes2.gif
а с квадратом я всё равно что-то не понял как цикл делать!
мисс_граффити
в общих чертах - можно так (а можно и иначе...):
uses crt;
const shag = 0.1;
eps=1E-5;
var
x,y:real;
count : integer ;

function func(x,y:real ):real;
begin
func:=sqrt(1-sqr(x)-sqr(y));
end;

begin
clrscr;
count := 1;
x := 0;
y := 0;
While x < 1+eps do
begin
y:=0;
while y< 1+eps do
begin
if (1-sqr(x)-sqr(y))>=0 then
begin
write(count:2,')','x=',x:0:1,' y=',y:0:1,' z(x,y)=',func(x,y):0:3,'; ');
inc(count);
if odd(count) then
writeln;
end;
y:= y+shag;
end;
x:= x+shag;
end;
readln;
end.

но при таком раскладе возникает один глюк (из-за погрешности вычислений). постарайся его найти.
Василяй
Цитата(мисс_граффити @ 17.06.2007 20:50) *

eps=1E-5;


а для чего эта строчка?
Щя попытаемся найти этот глюк smile.gif
мисс_граффити
вещественные числа не принято (ну, это не просто традиция, а во избежание лишних глюков) сравнивать через =. то есть лучше написать не с>=0.3, а с>0.2999999999, или (чтобы было нагляднее и проще было задать точность), с>3-eps, где eps - какое-то маленькое число (у меня это 10^-5)
Василяй
Цитата
вещественные числа не принято (ну, это не просто традиция, а во избежание лишних глюков) сравнивать через =. то есть лучше написать не с>=0.3, а с>0.2999999999, или (чтобы было нагляднее и проще было задать точность), с>3-eps, где eps - какое-то маленькое число (у меня это 10^-5)

понятно

Цитата
но при таком раскладе возникает один глюк (из-за погрешности вычислений). постарайся его найти.

я так понял что глюк, это то что скачет шаг у Y ( шаг должен быть 0.1, а он 0.2). верно?
мисс_граффити
почему??? 0.1, как положено....
просто выводится в 2 столбика, посмотри внимательнее
Василяй
Цитата(мисс_граффити @ 17.06.2007 21:12) *


...
if odd(count) then
writeln;
end;
...


вроде этот цикл создаёт этот глюк?
мисс_граффити
это не цикл
и к глюку никакого отношения не имеет...

вывод в 2 столбика позволяет лучше поместить строчки, иначе они совсем не влезают
Василяй
Всё понятно! спасибо за помощь!
crazy.gif good.gif crazy.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.