Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Значение периодической функции 
:(
    Опции темы
Winterlord
Дата 23.11.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



Здравствуйте уважаемые программисты и просто читатели форума. Я столкнулся с проблемой при написании программы. Для начала задание: периодическая функция f(x) определена на всей числовой прямой и имеет период Т. График функции на отрезке [0,Т] приведён на рисунке ниже. По заданному значению х вычислить значение функции.

user posted image

На первый взгляд кажется, что всё просто. С клавиатуры мы вводим значения a,b,c,x. Я описал значения у при вводимых значениях для 1 положительного периода, но никак не могу догадаться как с помощью периода заставить программу определять введённый х и соотносить его с периодом. Так же возникает сложность с отрицательным значением х и с отрицательным периодом, с ними вообще хз как быть. Вообще мою программу можно расписать в несколько строчек, ибо функция симметрична. Программа считается простой, но я что-то замудрил и вконец запутался. Если у кого то будет время и желание помочь, подскажите плз что делать с  периодом или как написать программу с помощью симметрии. Заранее очень благодарен. 

Вот мои наработки (не доконца написано про отрицательные х):
Код

/**/
#include <iostream.h>
#include <math.h>
#include <conio.h>

void main(){
"Purpuse: Find value of function";
float y,x,a,c,b,T,x1;
cout<<"\nVvedite x: ";
cin>>x;
cout<<"Vvedite a: ";
cin>>a;
cout<<"Vvedite b: ";
cin>>b;
cout<<"Vvedite c: ";
cin>>c;

T=4*a+2*c;
T=abs(T);
cout<<"T= "<<T;

if ((x>=0) && (x<=T)) {

if (x==0) { cout<<"\nPri x=0 y=0";}
if ((x>0) && (x<a)) {y=(x*b)/a; cout<<"\nPri x= "<<x<<"y= "<<y;}
if ((x>=a) && (x<=a+c)) {y=b; cout<<"\nPri x= "<<x<<"y= "<<y;}
if ((x>a+c) && (x<c+2*a)) {y=(x*b)/(c+2*a); cout<<"\nPri x= "<<x<<"y= "<<y;}
if (x==c+2*a) {y=0; cout<<"\nPri x= "<<x<<"y= "<<y;}
if ((x>c+2*a) && (x<c+3*a)) {y=x*(-b)/(c+3*a);cout<<"\nPri x= "<<x<<"y= "<<y; }
if ((x>=(c+3*a)) && (x<=(2*c+3*a))) {y=-b; cout<<"\nPri x= "<<x<<"y= "<<y;}
if ((x>2*c+3*a) && (x<4*a+2*c)) {y=((-b)*x)/(2*c+3*a); cout<<"\nPri x= "<<x<<"y= "<<y;}
if (x==2*c+4*a) {y=0; cout<<"\nPri x= "<<x<<"y= "<<y;}
}

if (x>T) {x1=x/T; x=x-(T*x1); 

if (x==0) { cout<<"\nPri x=0 y=0";}
if ((x>0) && (x<a)) {y=(x*b)/a; cout<<"\nPri x= "<<x<<"y= "<<y;}
if ((x>=a) && (x<=a+c)) {y=b; cout<<"\nPri x= "<<x<<"y= "<<y;}
if ((x>a+c) && (x<c+2*a)) {y=(x*b)/(c+2*a); cout<<"\nPri x= "<<x<<"y= "<<y;}
if (x==c+2*a) {y=0; cout<<"\nPri x= "<<x<<"y= "<<y;}
if ((x>c+2*a) && (x<c+3*a)) {y=x*(-b)/(c+3*a);cout<<"\nPri x= "<<x<<"y= "<<y; }
if ((x>=(c+3*a)) && (x<=(2*c+3*a))) {y=-b; cout<<"\nPri x= "<<x<<"y= "<<y;}
if ((x>2*c+3*a) && (x<4*a+2*c)) {y=((-b)*x)/(2*c+3*a); cout<<"\nPri x= "<<x<<"y= "<<y;}
if (x==2*c+4*a) {y=0; cout<<"\nPri x= "<<x<<"y= "<<y;}
}

if (x<0) {x=abs(x);}

if (x==0) { cout<<"\nPri x=0 y=0";}
if ((x>0) && (x<a)) {y=(x*b)/a; cout<<"\nPri x= "<<(-x)<<"y= "<<(-y);}
if ((x>=a) && (x<=a+c)) {y=b; cout<<"\nPri x= "<<(-x)<<"y= "<<(-y);}
if ((x>a+c) && (x<c+2*a)) {y=(x*b)/(c+2*a); cout<<"\nPri x= "<<(-x)<<"y= "<<(-y);}
if (x==c+2*a) {y=0; cout<<"\nPri x= "<<x<<"y= "<<y;}
if ((x>c+2*a) && (x<c+3*a)) {y=x*(-b)/(c+3*a);cout<<"\nPri x= "<<(-x)<<"y= "<<(-y); }
if ((x>=(c+3*a)) && (x<=(2*c+3*a))) {y=-b; cout<<"\nPri x= "<<(-x)<<"y= "<<(-y);}
if ((x>2*c+3*a) && (x<4*a+2*c)) {y=((-b)*x)/(2*c+3*a); cout<<"\nPri x= "<<(-x)<<"y= "<<(-y);}
if (x==2*c+4*a) {y=0; cout<<"\nPri x= "<<(-x)<<"y= "<<(-y);}

char ch;
cin>>ch;

}

PM MAIL ICQ   Вверх
shara
Дата 26.11.2008, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: 2
Всего: 2



насчет симетрии 
Зная период функции, я так понимаю это Т вводимое число (параметр) x имеет смысл его брать по модулю T
т.е. 
Код

int new_x=x%T;


и вся задача сводится к вычислению значания функции по оси Х от 0 (нуля) до T


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
Winterlord
Дата 26.11.2008, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



Ну я и вычисляю от нуля до Т, но фунция симметрична ещё и внутри периода, тоесть от нуля до (с/2)+а
PM MAIL ICQ   Вверх
shara
Дата 26.11.2008, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: 2
Всего: 2



только нужно учесть что в точке (с/2)+а функция меняет свой знак 
т.е. 
Код

if (x>(с/2)+а) 
   y=-y;

if (x==(с/2)+а)
  y=0;



тоесть учитывать остается только диапазон от 0 до (с/2)+a

Это сообщение отредактировал(а) shara - 26.11.2008, 00:44


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
Winterlord
Дата 26.11.2008, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



Не может функция от (с/2)+а менять знака, если на отрицательном х, то да, а на положительном нет
PM MAIL ICQ   Вверх
shara
Дата 27.11.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: 2
Всего: 2



Код

int fx(int a, int b, int c, int x)
{
  int y=0;
  int x1=x%(2*a+c); // работаем только с половиной периода функции

// x1 всегда должен быть больше нуля и находится в промежутке от 0 до 2а+с

  if (x1 > a) && (x1 < a+c) 
     y = b;                  // попали на пик функции, длина которого равна С
  else
    y =  ((c+2a-x1)*b)/a; // функция попала на спад\подъем функции (тут она тоже симетрична)

  if (x%2*x1) > (2*a+c) // если поали на второй полупериод функции
    y*=-1; // инвертируем Y

  return y;
}


Проверь должно работать

хоят на 100% правильность кода не претендую.. может чего не учел

Добавлено через 47 секунд
кстати надеюсь ты умеешь пользоваться функциями .... smile 


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
Winterlord
Дата 1.12.2008, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 5.10.2008

Репутация: нет
Всего: нет



shara, Спасибо большое, что пытался помочь. Я уже сам разобрался. Описал значения функции в периоде, дальше сделал так, чтобы любой х соотносился с периодом и тоже самое с отрицательными значениями. Получилось очень грамостко, зато работает;)
PM MAIL ICQ   Вверх
shara
Дата 1.12.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: 2
Всего: 2



вобщем то не зачто.
 попробуй протестируй заодно и мою функцию, я ее не тестил на примерах но она должна работать правильно.

Добавлено через 56 секунд
думаю 8 строчек кода смотрется более привлекательно чем куча ифов


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.