IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> найти значение функции, или история одного сумасшедствия - Lapp ))
roza
сообщение 14.04.2011 2:42
Сообщение #1





Группа: Пользователи
Сообщений: 1
Пол: Женский

Репутация: -  0  +


По заданному на рисунке графику найти значение функции у по переменной х, у изменяется от (-1,1)Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 14.04.2011 3:21
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 14.04.2011 3:43
Сообщение #3


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


И еще один способ до кучи ))
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) сразу после ввода).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 14.04.2011 5:08
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Что-то не отпускает меня эта задача.. Вот еще один способ 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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 14.04.2011 6:13
Сообщение #5


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Шестой способ центрирован на середины горизонтальных отрезков. Вся область разбивается на куски длиной 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.


а что? я ничего.. я тихий, смирный.. сижу - примус починяю (С).. не надо меня в Кащенко.. можно я погрызу ваши тапки? ну что вам, жалко что ли.. тяф!.. тяфф!..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 14.04.2011 7:25
Сообщение #6


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Еще одна модификация первого способа, но в другом смысле (нежели чем способ 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 Кто со мной? на обратную сторону Луны не приглашать, там всегда дождь..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 14.04.2011 9:11
Сообщение #7


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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 - это такая функция, которая в зависимости от знака первого аргумента возвращает второй или третий)


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 14.04.2011 12:30
Сообщение #8


Гость






Цитата
Ага, так и вышло )).
В моей классификации он назвался 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
сообщение 14.04.2011 23:57
Сообщение #9


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(volvo @ 14.04.2011 13:30) *
А чего дальше не продолжил?

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

Welcome to the club, Sir volvo! smile.gif

В настоящий момент я раздумываю над рекуррентно-геодезическим решением.. smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 29.03.2024 12:21
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"