Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Табулирование функции

Автор: Василяй 17.06.2007 23:29

Помогите разобраться в задаче!
Задание такое: Затабулировать функцию двух переменных 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.

Автор: мисс_граффити 17.06.2007 23:35

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 23:49

Цитата(мисс_граффити @ 17.06.2007 20:35) *

а нельзя так:

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


можно yes2.gif
а с квадратом я всё равно что-то не понял как цикл делать!

Автор: мисс_граффити 17.06.2007 23:50

в общих чертах - можно так (а можно и иначе...):

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 23:54

Цитата(мисс_граффити @ 17.06.2007 20:50) *

eps=1E-5;


а для чего эта строчка?
Щя попытаемся найти этот глюк smile.gif

Автор: мисс_граффити 17.06.2007 23:57

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

Автор: Василяй 18.06.2007 0:05

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

понятно

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

я так понял что глюк, это то что скачет шаг у Y ( шаг должен быть 0.1, а он 0.2). верно?

Автор: мисс_граффити 18.06.2007 0:12

почему??? 0.1, как положено....
просто выводится в 2 столбика, посмотри внимательнее

Автор: Василяй 18.06.2007 1:03

Цитата(мисс_граффити @ 17.06.2007 21:12) *


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


вроде этот цикл создаёт этот глюк?

Автор: мисс_граффити 18.06.2007 1:07

это не цикл
и к глюку никакого отношения не имеет...

вывод в 2 столбика позволяет лучше поместить строчки, иначе они совсем не влезают

Автор: Василяй 18.06.2007 1:18

Всё понятно! спасибо за помощь!
crazy.gif good.gif crazy.gif