Помощь - Поиск - Пользователи - Календарь
Полная версия: найти значение функции
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
roza
По заданному на рисунке графику найти значение функции у по переменной х, у изменяется от (-1,1)Нажмите для просмотра прикрепленного файла
Lapp
Цитата(roza @ 14.04.2011 3:42) *
По заданному на рисунке графику найти значение функции у по переменной х, у изменяется от (-1,1)Нажмите для просмотра прикрепленного файла

Как-то так..
var
x,y,z: double;

begin
readln(x);
z:= Frac(Abs(x)/6)*6;
if z<1 then y:= 1-z
else if z<2 then y:= 0
else if z<3 then y:= 2-z
else if z<4 then y:= z-4
else if z<5 then y:= 0
else y:= z-5;
writeln(y:8:3);
readln
end.

Или вот так:
const
a: array [0..5] of double = ( 1, 0, 2,-4, 0,-5);
b: array [0..5] of double = (-1, 0,-1, 1, 0, 1);

var
x,y,z: double;

begin
readln(x);
z:= Frac(Abs(x)/6)*6;
y:= a[Trunc(z)]+b[Trunc(z)]*z;
writeln(y:8:3);
readln
end.
Lapp
И еще один способ до кучи ))
var
x,y: double;

begin
readln(x);
y:= Round(Cos(Trunc(x)*Pi/3)*0.9)+(Round(Cos((Trunc(x)+1)*Pi/3)*0.9)-Round(Cos(Trunc(x)*Pi/3)*0.9))*Frac(x);
writeln(y:8:3);
readln
end.

Но это в предположении, что x>=0 (как, сосбно, и есть на рисунке). Если нужна отрицательная полуось, то нужно просто везде заменить x на Abs(x) (либо сделать x:=Abs(x) сразу после ввода).
Lapp
Что-то не отпускает меня эта задача.. Вот еще один способ smile.gif
Тут я для разнообразия выделил повторяющиеся вычисления в функцию - в третьем способе это тоже напрашивается. Способ вообще аналогичен третьему, но там периодичность достигалась косинусом, а тут - простым делением на 6 (как в первых двух).
var
x,y: double;

function f(x: double): double;
begin
f:= Round(Abs(Frac(x/6)-0.5)*4-1)
end;

begin
readln(x);
x:= Abs(x);
y:= f(Trunc(x)) + (f(Trunc(x+1))-f(Trunc(x)))*Frac(x);
writeln(y:8:3);
readln
end.

Оговорка про знак x та же, что и в предыдущем методе, только тут я уже вставил Abs(x).

Интересно - этот способ окажется последним? ))

Добавлено через 17 мин.
Пятый способ является модификацией первого, основанной на симметричности периода..
var
x,y,z: double;

begin
readln(x);
z:= Abs(Frac(Abs(x)/6)*6-3);
if z<1 then y:= z-1
else if z<2 then y:= 0
else y:= z-2;
writeln(y:8:3);
readln
end.


люди, спасите, пропадаю.. как мне эту дрянь из головы выкинуть??..
"режьте, братцы, режьте, режьте осторожно.." (С)
lol.gif
Lapp
Шестой способ центрирован на середины горизонтальных отрезков. Вся область разбивается на куски длиной 3 (с центрами в означенных точках). На каждом таком куске наша функция оказывается нечетной, при этом знак функции чередуется от куска к куску:
var
x,y: double;

function f(x: double): double;
begin
f:= Abs(Frac(x/3)-0.5)
end;

begin
readln(x);
x:= Abs(x);
if f(x)<1/6 then y:=0
else y:= (f(x)*3-0.5)*(1-Trunc((x+1.5)/3) mod 2*2);
writeln(y:8:3);
readln
end.


а что? я ничего.. я тихий, смирный.. сижу - примус починяю (С).. не надо меня в Кащенко.. можно я погрызу ваши тапки? ну что вам, жалко что ли.. тяф!.. тяфф!..
Lapp
Еще одна модификация первого способа, но в другом смысле (нежели чем способ 5). Просто замена вложенных if на case, что позволяет немало сократить код:
var
x,y,z: double;

begin
readln(x);
z:= Frac(Abs(x)/6)*6;
case Trunc(z) of
0: y:= 1-z;
1,4: y:= 0;
2: y:= 2-z;
3: y:= z-4;
else y:= z-5;
end;
writeln(y:8:3);
readln
end.


ляляля... ляляля.. ...
Таак, интересно.. кажется, этот способ может быть продолжен..
кто нибудь дома? тук-тук!

Добавлено через 15 мин.
Цитата(Lapp @ 14.04.2011 8:25) *
Таак, интересно.. кажется, этот способ может быть продолжен..

Ага, так и вышло )).
В моей классификации он назвался 7a, но тут пускай уж будет восьмой:
var
x,y,z: double;
i: integer;

begin
readln(x);
z:= Frac(Abs(x)/6)*6;
i:= Trunc(z);
case i of
0,2: y:= i div 2+1-z;
1,4: y:= 0;
else y:= z-4-(i-3) div 2;
end;
writeln(y:8:3);
readln
end.

Я тут ввел еще одну (целую) переменную - чисто для удобства (и небольшой экономии вычислений).

чуть помедленее, кони, чуть помедленнее..
не указчики вам кнут и плеть!..
(С)

а вы не слышали - какая погода на северо-востоке кратера Коперника в эти выходные?.. надо бы смотаться, развеяться немного wacko.gif Кто со мной? на обратную сторону Луны не приглашать, там всегда дождь..
TarasBer
case(cos(x*pi/3)-cos(pi/3),1-arccos(cos(x*pi/3))*3/pi,case(cos(x*pi/3)-cos(2*pi/3),0,2-arccos(cos(x*pi/3))*3/pi))

(case - это такая функция, которая в зависимости от знака первого аргумента возвращает второй или третий)
volvo
Цитата
Ага, так и вышло )).
В моей классификации он назвался 7a, но тут пускай уж будет восьмой:
А чего дальше не продолжил?
   case i of
0 .. 2, 4 : y := abs(1 - i mod 3)*(i div 2 + 1 - z) + 0;
else y := z - 4 - (i - 3) div 2;
end;
Lapp
Цитата(volvo @ 14.04.2011 13:30) *
А чего дальше не продолжил?

Дык. Надо же было что-то оставить коллегам, я ж не жадина lol.gif .

Welcome to the club, Sir volvo! smile.gif

В настоящий момент я раздумываю над рекуррентно-геодезическим решением.. smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.