Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Маринчик
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 138
#1

ошибочки. как разобраться?найти точки перегиба - C++

25.04.2013, 23:50. Просмотров 468. Ответов 2
Метки нет (Все метки)

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

Из школы знаю,что если для функции y = f (x) в некоторой точке xо f² (xo ) = 0 и при переходе через эту точку меняет свой знак на обратный, то точка М(хo,f(xo)) является точкой перегиба функции.

Для второй производной я программу составила, а как правильно поставить условие для точек перегиба не могу понять.. В том что написала в программке для условия по точкам, почему-то значения считает не те которые надо, или вообще не считает.. Объясните что не так, и как правильнее.
То что у меня наработано:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
double   f1(double  x)/*vira*enie 1*/
 {return (x*cos(x))/(1+ pow(x,2));}
 
double   f2 (double  x) /*vira*enie 2*/
{return(exp(x)/x);}
 
double  f3 (double  x)/*vira*enie 3*/
{return (1/(3+2*cos(x)));}
 
/* pervaja proizvodnaja iz klassi4eskogo opredelenija eto f'(x)=(f(x0)-f(x))/(x-x0) */
/* opredelim proizvodnyjy s tochnost'jy h=x-x0=0.001 */
/* znachit x0=x-h */
/*polychaem znachenie dlja proizvodnoj (f(x-h)-f(x)/h */
double  proizv1(double (*f)(double ),double  x)
{ double   h;
h=0.001;
return(( (*f)(x-h)-(*f)(x))/h);      //dlja pervoj proizvodnoj: proizv1(f1) proizv1(f2) proizv1(f3)
}
 
 
/*vtoraja proizvodnaja iz klassi4eskogo opredelenija*/
/* f''(x)=(f'(x))' proizvodnaja ot proizvodnoj*/
double  proizv2( double  (*proizv)(double ),double   x)
{ double  h;
  h=0.001;
//mo*no vizvat' pervyjy proizvodnyjy: ff=proizv1(f1);ff=proizv1(f2);ff=proizv1(f3);//
return(( (*proizv)(x-h)-(*proizv)(x))/h);  //dlja vtoroj proizvodnoj ili return(( (proizv1)(x-h)-(proizv1)(x))/h); 
}
 
void tochki(double  (*t)(double ),double  xn,double   xk,double  dx)    //vizov bydet tochki(proizv2,xn,xk,dx)
{double  x1; int i,z; double  a[20];
 printf(" ____________________________\n");
 printf("|___i___|___x___|_____y______|\n");
 i=0;
  for (x1=xn;x1<=xk;x1+=dx)
   {proizv2(t,x1);
    i++;
    printf("|___%d___|__%.1f__|_%.5f___|\n",i,x1,proizv2(t,x1));
   }
  
  
  
  printf("\ntochka peregiba:");
       for(z=0;z<=i;z++) 
       { for(x1=xn;x1<=xk;x1+=dx)
            { a[z]=proizv2(t,x1);
             } 
        }
 /// zdes' 4toto ne tak
 
   for(z=0;z<=i;z++) /*yslovie syshestvovanija tochki peregiba*/
    { for(x1=xn;x1<=xk;x1+=dx)
          {if ( (a[z]*a[z+1])<0 )printf("\nx=%.1f y=%.5f",x1,a[z+1]);}
     }           //tochka peregiba tam, gde fynkcija menjaet znak:     
                 
           //v f1 tochki peregiba dol*nu but' x= -2 0 3 y=sootvetstvyjyshie
          //f2 tochki peregiba dol*nu but' x=0 y y=sootvetstvyjyshie
        // f3 tochki peregiba dol*nu but' x=0,5 ГЁ x=3,5 y=sootvetstvyjyshie
   
     
  
  
  
  
  
printf("\n");  
} 
 
void vibor(  )
{int n;
printf("S kakoj fynkciej bydem rabotat'?\n");
printf("1.  x*cos(x))/(1+ pow(x,2)\n");
printf("2. exp(x)/x\n");
printf("3. 1/(3+2*cos(x))\n");
printf("0. Vihod\n"); 
  scanf("%d",&n);
   switch(n)
            {case 1: tochki(f1,-4,4,1); break;//dlja pervoj fynkcii na intervale -4 4
             case 2: tochki(f2,-6,1,1); break;//dlja vtoroj fynkcii na intervale -6 1
             case 3: tochki(f3,0,4,1); break;//dlja tret'ej fynkcii na intervale 0 4
             case 0: break;    
             default:printf("Nevernij re*im");  
             }
}          
 int main()
  {vibor();
   system("pause");
   return 0;
   }
Могу изложить свои рассуждения по нахождению точек перегиба.Значения ведь идут последовательно при вычислении производной,значит их можно рассматривать как массив, где можно найти необходимые точки-значения.Если знаки сначала идут +++ ( (+)*(+) или (-)*(-) дают плюс)при произведении, а потом резко появится - при произведении( (+)*(-) или (-)*(+)дают минус), значит там где минус,то есть 1множитель*2множитель<0 нужно искать нужную точку ,второй множитель и будет искомым значением,ведь на нем меняется знак.Даже если потом будет +++ то при новом - будет еще одна точка..по моему логично..или не очень логичные и правильные рассуждения??если верные рассуждения,скажите что не правильно у меня в проге в этой части,или как правильнее записать..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2013, 23:50     ошибочки. как разобраться?найти точки перегиба
Посмотрите здесь:

Найти точки перегиба на графике - C++
Доброго времени суток! У меня есть программа, которая строит график по числам из массива.(пример графика ниже). Мне нужно находить на...

определить точки перегиба функции на заданном интервале - C++
x*cos(x))/(1+ pow(x,2) на интервале хочу разобраться по порядку понимаю что нужно считать численное значение функции.значит,...

Ошибочки в функции - C++
bool dfs (int i1, int pArray,int q) { bool test; int n=10, m=12; int d1; for(int d=0; d&lt;m; d++) { if(pArray==1) ...

Как найти точки пересечения двух синусоид? - C++
Есть две синусоиды вида: y = a + b*sin(c*x + d) a,b,c,d - постоянные. x - в заданном интервале, допустим от -10 до +10. Нужно найти...

как при помощи класса создать 2 точки и найти между ними расстояние - C++
дравствуйте, помогите пожалуста, скажите как при помощи класса создать 2 точки и найти между ними расстояние.Заранее спасибо!:)

Помогите разобраться: Найти количество четных делителей натурального числа. - C++
Здравствуйте, уважаемые пользователи. Нехватка времени вынуждает меня прибегнуть к помощи умных людей. Не могли бы вы помочь мне...

найти точки пересечения y = ax^3 + bx^2 + cx + d и y = kx + m - C++
Задача: Определить, пересекаются ли линии y = ax^3 + bx^2 + cx + d и y = kx + m. Если пересекаются, найти точки пересечения ...

Найти седловые точки матрицы - C++
Ввести данные в прямоугольную матрицу, вывести матрицу на экран. В матрице найти седловые точки (найти номер строки и столбца для каждой...

Найти точки экстремума функции - C++
Вечер добрый! Собственно вопрос: имеется такая функция f(x) = (1-x)^4 + 3*sin(x) +2*cos(x) Нужно найти в ней min и max (на графике...

Найти проекцию точки на прямую (С++) - C++
Скоро курсач сдавать, в одном задании не успеваю разобраться как делать. Задание такое: Создать заголовочный файл, содержащий...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3117 / 1919 / 208
Регистрация: 13.01.2012
Сообщений: 7,349
26.04.2013, 10:17     ошибочки. как разобраться?найти точки перегиба #2
точка перегиба - это когда вторая производная меняет знак. бегите по точкам и проверяйте знак произведения второй производной в текущей точке на вторую производную в предыдущей точке. когда увидите минус или ноль (ну а вдруг) - зафиксирована точка перегиба.
Маринчик
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 138
26.04.2013, 21:43  [ТС]     ошибочки. как разобраться?найти точки перегиба #3
vxg, это я понимаю.. я не понимаю как програмно этот момент рассматривать...как в программе записать..перебирать значения второй производной как массив для этого условия или как??я вроде в программе , которую выше написала,поставила условие, но либо не выводятся результаты, либо выводятся все значения для второй производной по х..
что я в программе не так сделала?

Добавлено через 27 минут
как реализовать разобралась, переделала прогу.. но не все значения выводятся..только для второй функции.. а если выбирать первую или треть то нет, почему??
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
double   f1(double  x)/*vira*enie 1*/
 {return (x*cos(x))/(1+ pow(x,2));}
 
double   f2 (double  x) /*vira*enie 2*/
{return(exp(x)/x);}
 
double  f3 (double  x)/*vira*enie 3*/
{return (1/(3+2*cos(x)));}
 
/* pervaja proizvodnaja iz klassi4eskogo opredelenija eto f'(x)=(f(x0)-f(x))/(x-x0) */
/* opredelim proizvodnyjy s tochnost'jy h=x-x0=0.001 */
/* znachit x0=x-h */
/*polychaem znachenie dlja proizvodnoj (f(x-h)-f(x)/h */
double  proizv1(double (*f)(double ),double  x)
{ double   h;
h=0.001;
return(( (*f)(x-h)-(*f)(x))/h);      //dlja pervoj proizvodnoj: proizv1(f1) proizv1(f2) proizv1(f3)
}
 
 
/*vtoraja proizvodnaja iz klassi4eskogo opredelenija*/
/* f''(x)=(f'(x))' proizvodnaja ot proizvodnoj*/
double  proizv2( double  (*proizv)(double ),double   x)
{ double  h;
  h=0.001;
//mo*no vizvat' pervyjy proizvodnyjy: ff=proizv1(f1);ff=proizv1(f2);ff=proizv1(f3);//
return(( (*proizv)(x-h)-(*proizv)(x))/h);  //dlja vtoroj proizvodnoj ili return(( (proizv1)(x-h)-(proizv1)(x))/h); 
}
 
void tochki(double  (*t)(double ),double  xn,double   xk,double  dx)    //vizov bydet tochki(proizv2,xn,xk,dx)
{double  x1; int i,z; double  a[20];
 printf(" ____________________________\n");
 printf("|___i___|___x___|_____y______|\n");
 i=0;
  for (x1=xn;x1<=xk;x1+=dx)
   {proizv2(t,x1);
    i++;
    printf("|___%d___|__%.1f__|_%.5f___|\n",i,x1,proizv2(t,x1));
   }
  printf("\ntochka peregiba:");
  
  if ((proizv2(t,x1-1))*(proizv2(t,x1))<=0)
         printf("x=%.1f y=%.5f",x1-1,proizv2(t,x1-1));
  
   //tochka peregiba tam, gde fynkcija menjaet znak:     
                 
           //v f1 tochki peregiba dol*nu but' x= -2 0 3 y=sootvetstvyjyshie
          //f2 tochki peregiba dol*nu but' x=0 y y=sootvetstvyjyshie
        // f3 tochki peregiba dol*nu but' x=0,5 ГЁ x=3,5 y=sootvetstvyjyshie
 printf("\n");  
} 
 
void vibor(  )
{int n;
printf("S kakoj fynkciej bydem rabotat'?\n");
printf("1.  x*cos(x))/(1+ pow(x,2)\n");
printf("2. exp(x)/x\n");
printf("3. 1/(3+2*cos(x))\n");
printf("0. Vihod\n"); 
  scanf("%d",&n);
   switch(n)
            {case 1: tochki(f1,-4,4,1); break;//dlja pervoj fynkcii na intervale -4 4
             case 2: tochki(f2,-6,1,1); break;//dlja vtoroj fynkcii na intervale -6 1
             case 3: tochki(f3,0,4,1); break;//dlja tret'ej fynkcii na intervale 0 4
             case 0: break;    
             default:printf("Nevernij re*im");  
             }
}          
 int main()
  {vibor();
   system("pause");
   return 0;
   }
Добавлено через 9 минут
или это не правильно??

Добавлено через 18 минут
разобралась..все работает.. извините дурную за глупые вопросы
Yandex
Объявления
26.04.2013, 21:43     ошибочки. как разобраться?найти точки перегиба
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru