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

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

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

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





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

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


По заданному на рисунке графику найти значение функции у по переменной х, у изменяется от (-1,1)Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


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

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

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


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

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

Welcome to the club, Sir volvo! smile.gif

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


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

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

 





- Текстовая версия 23.12.2024 21:26
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name