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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2012, 16:55   #1
riko782
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 40
Восклицание Метод простых итераций. С/C++

Такое задание: написать алгоритм численного решения нелинейных уравнений методом простых итераций и реализовать его на языке программирования.
Сколько не читал и не искал инфу про данный метод, все никак не могу понять суть данного метода, отсюда и сложности в реализации на языке, в данном случае С/С++.
Поясните, пож-ста, суть данного метода, ну если можно приведите пример решения конкретной задачи.
Спасибо.
riko782 вне форума Ответить с цитированием
Старый 17.03.2012, 18:28   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от riko782 Посмотреть сообщение
Поясните, пож-ста, суть данного метода
http://mpec.sc.mahidol.ac.th/numer/STEP9x.HTM

Цитата:
Сообщение от riko782 Посмотреть сообщение
если можно приведите пример решения конкретной задачи.
http://programmersforum.ru/showthread.php?t=84437
Vago вне форума Ответить с цитированием
Старый 17.03.2012, 18:52   #3
riko782
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 40
По умолчанию

Спасибо за ссылки. У меня один вопрос: каким образом задается функция фи? В смысле переход от f(x) = 0 к x = fi(x) ?
riko782 вне форума Ответить с цитированием
Старый 17.03.2012, 19:15   #4
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Ну как "каким образом"... В голове! "Берём картину мироздания" - исходное уравнение в смысле, "и тупо смотрим", нельзя ли выдернуть из него x выразив его через себя же.
Vago вне форума Ответить с цитированием
Старый 17.03.2012, 19:40   #5
riko782
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 40
По умолчанию

Хорошо. Есть, к примеру, такое уравнение (х-1)(х+2)(х-4)-х. Как для него реализовать данный метод?

Тот код (http://programmersforum.ru/showthread.php?t=84437) не будет же выдавать все 3 корня, а только 1...

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

А он и не должен выдавать все корни. Он находит ОДИН корень на [каким-то образом уточнённом] интервале, заведомо этот самый единственный корень содержащем. Уточнение этого интервала (уточнение (отделение) корней) - отдельная [часто - шаманская] песТня, к методу простых итераций (и вообще к методам нахождения корней) отношения не имеющая. Знаем, что корней три - трижды запускаем метод на трёх разных интервалах.
Vago вне форума Ответить с цитированием
Старый 18.03.2012, 14:15   #7
riko782
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 40
По умолчанию

Такой вопрос: как правильно записать код, который будет подсчитывать кол-во корней? В следующем коде пытался реализовать такую логику: Количество корней зависит от того, сколько раз ф-ция меняет свой знак.
Код:
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;

    double function( double x ) {
       return (x-1)*(x+2)*(x-4);
    }

    void NumberOfRoots(double min, double max)
    {	int k=0;
           cout<<"Enter the number of intervals ";
           cin>>n;
//дальше проблема в цикле: зацикливается...
           for(int i = min; i <= max; i+((max-min)/n)){
	    if (function(i)*function(i+(max-min)/n) <= 0) 
                   k++;
	}
	cout<<"Number of roots is "<<k<<endl;
    }

int main(){
    NumberOfRoots(-3, 5);
}
Подскажите, пож-ста, как переделать данный код.

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

Цитата:
Сообщение от riko782 Посмотреть сообщение
Код:
...
//дальше проблема в цикле: зацикливается...
           for(int i = min; i <= max; i+((max-min)/n)){
Во-первых, +=
а во-вторых, цикл for сам по себе - не для подобных задач. Напиши вот так:
Код:
   ...
   int deI = (max-min)/n ;
   for (int i=min; i<=max; i+=deI ) {
   ...
и посмотри отладчиком, чему будет равно deI Оно, когда сам дойдёшь, надольше запоминается...
Vago вне форума Ответить с цитированием
Старый 18.03.2012, 15:09   #9
riko782
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 40
По умолчанию

Тут проблема в чем. Тут же ж получается у нас i - интовская переменная, а в цикле вычисляется не целые числа, поэтому и зацикливается. Я показал пример кода, что бы показать что я хочу сделать, саму идею, но реализация должна выглядеть по-другому. Это я и спрашиваю, на счет реализации...
riko782 вне форума Ответить с цитированием
Старый 18.03.2012, 15:12   #10
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цикл while учили?..
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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