Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2012, 19:16   #21
riko782
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 40
По умолчанию

Если у Вас есть скайп, добавьте меня

Последний раз редактировалось riko782; 18.03.2012 в 23:18.
riko782 вне форума Ответить с цитированием
Старый 18.03.2012, 22:11   #22
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Вот так это примерно будет выглядеть:
Код:
#include <iostream>
#include <math.h>
using namespace std;

//p #define TESTPRINT

inline double F0( double x ) { return (x-1.)*(x+2.)*(x-4.)-x ; } 


double FSI( double x, int jFormula ) { 

   switch ( jFormula ) {
      case 1:
         return -2. + x/((x-4.)*(x-1.)) ;
         break ;
      case 2:
         return  1. + x/((x-4.)*(x+2.)) ;
         break ;
      case 3:
         return  4. + x/((x-1.)*(x+2.)) ;
      break ;
   }

}


bool GetInterval( double* xLeft, double* xRight, double xStop, double deX ) {

   double   fLeft = F0( *xLeft ), 
            fRight ;

   *xRight = *xLeft + deX ;
   fRight = F0( *xRight ) ;
   while ( fLeft * fRight > 0. ) {
      *xLeft = *xRight ;
      fLeft = fRight ;
      *xRight += deX ;
      if ( *xRight > xStop ) 
         return false ;
      fRight = F0( *xRight ) ;
   }

   return true;

}


double SimpleIter( double x0, int jFormula, double eps ) {

   double   x, xNext ;
   int      nIter;

   x = x0 ;
   xNext = FSI( x, jFormula ) ;
   nIter = 1;

   while ( fabs( xNext-x ) > eps ) {
      x = xNext;
      xNext = FSI( x, jFormula ) ;
      ++nIter;
#ifdef TESTPRINT
      printf( "%.5g %.5g %d\n", x, xNext, nIter );
#endif
   }

#ifdef TESTPRINT
   printf( "The root %.5g has been reached to within %.5g after %d iterations.\n", 
           xNext, eps, nIter );
#endif

   return xNext ;

}


int main() {

   double   eps = 0.00005 ,
            xMin = -5. ,
            xMax = 5. ,
            xLeft = xMin, 
            xRight ,
            deX = 0.10 ;
   int      jFormula = 1 ;

   while ( xLeft < xMax ) {
      if ( GetInterval( &xLeft, &xRight, xMax, deX ) ) {
         cout << "The root " << SimpleIter( xRight, jFormula++, eps )  ;
         cout << " is found on the [ " << xLeft << ", " << xRight << "] interval" << endl ;
         xLeft = F0( xRight ) != 0 ? xRight : xRight+deX ;
      }
   }

   return 0 ;

}
Как я понимаю, мат. подготовка - весьма слабенькая... Вкратце - метод простых итераций весьма чувствителен к способу "подмены" ф-ии, отсюда - switch. Если, всё-таки, захочется понять тонкости - "Методы вычислений" Березина - Жидкова в зубы, и - Vista, suerte y al Toro!..
Vago вне форума Ответить с цитированием
Старый 18.03.2012, 23:50   #23
riko782
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 40
По умолчанию

Спасибо большое!
riko782 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод простых итераций Su-34 Помощь студентам 0 07.12.2011 16:11
метод простых итераций, с++ kaljan775 Помощь студентам 0 08.03.2011 16:55
Метод простых итераций nikozavr Общие вопросы C/C++ 5 13.02.2011 14:36
Метод простых итераций bloodargus Общие вопросы C/C++ 4 26.11.2010 23:53
Метод простых итераций bloodargus Общие вопросы C/C++ 1 20.11.2010 12:48