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

Метод простых итераций - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.89
pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
04.11.2012, 01:24     Метод простых итераций #1
Необходимо реализовать программно метод простых итерация для решения НУ.
к примеру возьмём x^6-3x^2+x-1, интервал изоляции корня [-2,0].
Однако до конца метод не понимаю.
Точнее главные проблемы с проверкой сходимости...
К виду фи(x) привожу т.о.: fi(x) = x + c *(f(x)), однако как программно реализовать... не очень понимаю что то...
На входе задаю x0 = a, условие прерывания: xnext - x <=eps && x<=b (т.к.отрезок, однако почему то многие примеры на отрезок не уделяют внимания)...
Сейчас выглядит примерно так код (на сишке чистой не запускал, онли c#, но эт не главное, главное алгоритм):
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
 double function(double arg)
        {
            f = Math.Pow(arg, 6) - 3 * Math.Pow(arg, 2) + arg - 1;
            return f;
        }
 
        double fi(double arg, double c)
        {
            //g = 6 * Math.Pow(arg, 5) - 6 * arg + 1 + Math.Cos(arg);
            g = arg + c * (function(arg));
            return g;
        }
        double calc2()
        {
            x = a;
            xNext = fi(x, c);
            iterations = 1;
            while ((Math.Abs(xNext - x) > eps))//&& (xNext <= b)) 
            {
                x = xNext;
                xNext = fi(x, c);
                
                iterations++;
            }
            
            return xNext;
        }
И вызов:
Calculation solve1 = new Calculation(-2, 0, 0.001, 0.344731875);
Ещё бы как то c определять автоматом...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2012, 01:24     Метод простых итераций
Посмотрите здесь:

C++ Метод простых итераций для СЛАУ
метод простых итераций C++
C++ Метод простых итераций. С/С++
C++ Метод простых итераций для СЛАУ
Метод простых итераций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
04.11.2012, 04:02     Метод простых итераций #2
pavel1992, пройди по этой ссылке
Метод Ньютона и итераций для нелинейного уравнения
и просто замени в моём коде значение функции с этого
double f(double x)
{
return pow(2.0,x) - 2*pow(x, 2.0) - 1;
}
на это
double f(double x)
{
return pow(x,6.0) - 3*pow(x, 2.0) + x - 1;
}
pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
04.11.2012, 15:19  [ТС]     Метод простых итераций #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
pavel1992, пройди по этой ссылке
Метод Ньютона и итераций для нелинейного уравнения
и просто замени в моём коде значение функции с этого

на это
и всё же не совсем ясно, почему за c вы взяли 0,5 а не 35, не -0,751 и тд... Это надо как то доказать, мол ф-я сходится на данном отрезке...
На входе я так понимаю моё x0 = a, бегаем вплоть до b, но b = x на какой то итерации или что.... что то совсем запутался
+ для моего условия ещё задать b надо по идеи...

Добавлено через 2 часа 32 минуты
ибо для моей функции по моему решение точно не 3.7
-=ЮрА=-
Заблокирован
Автор FAQ
06.11.2012, 01:17     Метод простых итераций #4
pavel1992, отвечаю на твой вопрос
Цитата Сообщение от pavel1992 Посмотреть сообщение
почему за c вы взяли 0,5 а не 35, не -0,751
- как я уже указывал ранее
метод простых итераций предполагает схему
xk = g(xk-1) где g(x) = x + b*f(x) где b - произвльное число
Это не надо доказывать - это суть метода.
Теперь поясню почему я взял 0,5 - есть рекомендации в ряде источников брать 0,5 либо 0,05 либо 5 и т.д. Также в некоторых учебниках предлагают вводиьт допусловие остановки итераций основанное на характере изменения функции. Поясню - скажем при х1 значение функции отрицательно тобишь f(x1) < 0 а в точке х2 значение f(х2 = g(x1)) > 0 положительно, т.е получается на интервале х1...х2 функция пересекла числовую ось - вот такую стоп точку + коєффициент 0,05 я дополнительно ввёл в алгоритм и вот что получил
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
#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;
 
double f(double x)
{
//  return pow(2.0,x) - 2*pow(x, 2.0) - 1;
    return pow(x,6.0) - 3*pow(x, 2.0) + x - 1;
}
 
double g(double x)
{
    return x + 0.05*f(x);
}
 
int main()
{
    double x;
    double eps;
    cout<<"Enter initial root value   : ";cin>>x;
    cout<<"Enter error of calculation : ";cin>>eps;
    for(double iter = 1; eps < fabs(f(x)); iter = iter + 1)
    {
        system("cls");
        //*ÈòåðГ*öèé ìîæåò áûòü î÷åГ*Гј Г¬Г*îãî, ïîýòîìó ðåêîìåГ*äóþ Г§Г*áûòü
        //Г® öåëûõ Г* èñïîëüçîâГ*ГІГј Г¤Г*ГЎГ« ГЄГ*ГЄ Г±Г·ВёГІГ·ГЁГЄ, õîòÿ Гў ïðèГ*öèïå åñëè 
        //ðåøåГ*ГЁГҐ Г*ГҐ Г*Г*øëè Г§Г* 10-100 ГЁГІГҐГ°Г*öèé ГІГ® ðåøåГ*ГЁГї äëÿ Г¤Г*Г*Г*îãî êîýôôèöèåГ*ГІГ*
        //ïðè f(x) Гў g(x) Г*ГҐГІ ГЁ Г*Г*äî ГҐГЈГ® ìåГ*ГїГІГј
        cout<<"Iteration : "<<setprecision(0)<<iter<<endl;
        cout<<"x    = "<<x   <<endl;
        cout<<"g(x) = "<<g(x)<<endl;
        cout<<"f(x) = "<<f(x)<<endl;
        if(f(x)*f(g(x)) > 0)
            x = g(x);
        else
            break;      
    }
    system("pause");
    return 0;
}
Миниатюры
Метод простых итераций  
pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
06.11.2012, 01:41  [ТС]     Метод простых итераций #5
Неа, не убедительно ))
Нам препод говорит, c = выбирается таким образом, дабы производная фи была < 1...
-=ЮрА=-
Заблокирован
Автор FAQ
06.11.2012, 02:02     Метод простых итераций #6
Цитата Сообщение от pavel1992 Посмотреть сообщение
Нам препод говорит, c = выбирается таким образом, дабы производная фи была < 1...
- какая чёрт возьми производная в методе простых итераций?!

Предположу речь идёт о методе касательных либо о методе Ньютона. В методе простых итераций нет никакой производной.

Не по теме:

pS:Я не собираюсь никого убеждать, это ты сам меня сначала просишь посмотреть тему сначала в личке, потом в ВК. Если считаешь, что всё знаешь - вперёд, но меня больше не отвлекай совим проектом, либо слушай что тебе говорят. Далее дело твоё, но лично мне по барабану воспринимаешь мои слова, не воспримишь - не мне же это сдавать, а в своё время я всё сдал на отлично и никого о помощи не просил...

pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
06.11.2012, 13:35  [ТС]     Метод простых итераций #7
Дядя, за помощь тебе спасибо, но! Я тебе грубил? Какого ты гонишь на меня?
Не я это придумал, и не упрекаю я тебя ни в чём.
А вот книга что говорит:
Метод простых итераций
(и что нет производной в теме, да?)
-=ЮрА=-
Заблокирован
Автор FAQ
06.11.2012, 13:56     Метод простых итераций #8
Цитата Сообщение от pavel1992 Посмотреть сообщение
(и что нет производной в теме, да?)
- пишешь название скрина для клоуна, хорошо сейчас я покажу кто из нас клоун
В первой части твоего скрина написано о выборе интрвала изоляции корня которое должно удовлетворять условию |g'(x)| < q < 1 где q - это просто константа. Ты сам определил в задаче нужный интервал изоляции корня
Цитата Сообщение от pavel1992 Посмотреть сообщение
интервал изоляции корня [-2,0].
. А теперь раззуй свои глаза да почитай схему метода,
x = x + c*f(x) где c - произвльное число
я тебе даже на втоём скрине красным обвёл чтобы не дай бог ты не сбился.
И в схеме решения нет никакой производной. И кто из нас клоун, м?
Миниатюры
Метод простых итераций  
-=ЮрА=-
Заблокирован
Автор FAQ
06.11.2012, 14:09     Метод простых итераций #9
А если б ты ещё был знаком с итерационными методами и матанализом то посмотрел теоремку гласящую что |b - a| < h*|f(b) - f(a)| т.е условие остановки итераций |xk - xk-1| < e можно трансформировать в следующее
|f(xk) - f(xk-1)| < |f(xk) - f(xk-1)|*h < |xk - xk-1| < e
и стоп можно делать по такому условию |(f(xk) - f(xk-1))| < e
либо если бЫ кто-то ещё больше подключил бы мозг и знал бы что
f(x) == f(xk) == 0 условие стопа можно упростить ещё более
|f(xk-1)| < e либо |f(xk)| < e что и сделано в алгоритме
C++
1
eps < fabs(f(x))

Не по теме:

Действительно я за свою жизнь клоунов насмотрелся, но каждый день встречаются новые

pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
06.11.2012, 14:42  [ТС]     Метод простых итераций #10
Айда ща ещё какой-нить скрин кину в ответ на ответ, и назову ещё более весело...
Ну да ладно. Проехали... Просто ужасно бесит, когда начинают гнать ни с того, ни с сего (напомню: агрессия пошла с твоей стороны)
Темку закрыть.
За ответ благодарю.
-=ЮрА=-
Заблокирован
Автор FAQ
06.11.2012, 14:55     Метод простых итераций #11
pavel1992, да кидай скрин хоть себя на унитазе, этим ты только подчеркнёшь свою необразованность. Напомню, что никакой агресси я к тебе не проявлял
Т.е твоё клоун(которое явно было с контекстом обо всём что я излагал ранее) пошло после моей фразы
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
pS:Я не собираюсь никого убеждать, это ты сам меня сначала просишь посмотреть тему сначала в личке, потом в ВК. Если считаешь, что всё знаешь - вперёд, но меня больше не отвлекай совим проектом, либо слушай что тебе говорят. Далее дело твоё, но лично мне по барабану воспринимаешь мои слова, не воспримишь - не мне же это сдавать, а в своё время я всё сдал на отлично и никого о помощи не просил...
- если тут есть агрессия в твою сторону, то твоё "клоун" вообще попытка к убийству

Не по теме:

Цитата Сообщение от pavel1992 Посмотреть сообщение
За ответ благодарю.
- мне твои благодарности после твоего хамства, как мёртвому припарка.

pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
08.11.2012, 22:47  [ТС]     Метод простых итераций #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- пишешь название скрина для клоуна, хорошо сейчас я покажу кто из нас клоун
В первой части твоего скрина написано о выборе интрвала изоляции корня которое должно удовлетворять условию |g'(x)| < q < 1 где q - это просто константа. Ты сам определил в задаче нужный интервал изоляции корня . А теперь раззуй свои глаза да почитай схему метода,
x = x + c*f(x) где c - произвльное число
я тебе даже на втоём скрине красным обвёл чтобы не дай бог ты не сбился.
И в схеме решения нет никакой производной. И кто из нас клоун, м?
Ага, и всё же:
Хочешь сказать что при с=0,5 а x=0 итерационный процесс сходится? Ну ну...
Читать тут:
Кликните здесь для просмотра всего текста
А мы что тут собрались пиписяками мерятся или что? Для того и существует форум, чтобы из "балбесов" сделать образованных людей. Что за манера ставить себя выше?
-=ЮрА=-
Заблокирован
Автор FAQ
08.11.2012, 22:55     Метод простых итераций #13
pavel1992, если б ты умел читать,нашел бы критерии выбора константы с в моих постах.PS:Есть неписаная истина-в руках туземца даже ПК всего лишь груда металлолома. Аналогии проводи сам...
pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
08.11.2012, 23:33  [ТС]     Метод простых итераций #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
pavel1992, если б ты умел читать,нашел бы критерии выбора константы с в моих постах.PS:Есть неписаная истина-в руках туземца даже ПК всего лишь груда металлолома. Аналогии проводи сам...
Вот именно.... Посмотри, что даж поиском решения подобрать так c, дабы на всём промежутке fi`(x) -2;0 0<q<1 нифига не получается...
Продемонстрируй конкретно... А не продолжай глаголить какой я болван.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 11:28     Метод простых итераций
Еще ссылки по теме:

C++ Посчитать количество проведенных итераций (метод простых итераций, Pascal -> C++)
Метод простых итераций C++
C++ Метод простых итераций для СЛАУ

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
09.11.2012, 11:28     Метод простых итераций #15
pavel1992,
1 - е
Цитата Сообщение от pavel1992 Посмотреть сообщение
А мы что тут собрались пиписяками мерятся или что? Для того и существует форум, чтобы из "балбесов" сделать образованных людей. Что за манера ставить себя выше?
- лично я себя выше не ставил, ставил себя ты своим сарказмом и попытками (весьма приземлёнными) опровергнуть мои знания! Заруби на носу себе - я лучше владею этим материалом, т.к прошёл его где-то 7-мь лет назад (вот ты бы воспринял бы 3-е класника как человека который знает больше тебя, м?Уж прости за сравнение), но судя из твоих постов ты явно ознакомлен с методом простых итераций куда более глубже чем я, хм чего же тогда пишешь мне?

Не по теме:

2 - е (не по теме) уж больно твои слова напоминают слова одного человека (надеюсь ты не клон)


3 - е Ты сначала меня попытался обо*рать и тем не менее т.к сам не в состоянии решить своё задание подразумеваешь своими словами чтобы я всё же тебе помог
Цитата Сообщение от pavel1992 Посмотреть сообщение
Продемонстрируй конкретно... А не продолжай глаголить какой я болван.
. Т.е смотри противоречие пункта 1 и пункта 3. Твои знания лучше моих, но выходит без меня решить не можешь, ну так ведь?Хм и просишь помочь всё же, что это подразумевает?
Так вот pavel1992, вот тебе сначала демонстрация моих способностей, скажу что от кода поста 4 показанный мной алгоритм ничем не отличается(!). т.е пока тебе показываю как оно должно работать, а потом если ты успокоишся и начнёшь меня слошать дам код для копипипаста. Запомни одно правило - Если ты просишь кого-то о помощи то будь добр слушать этого человека и не грубить - по тому как это просто свинство.

Ну а теперь оставляю своё бла бла бла в стороне и даю тебе исполняемый модуль на базе кода поста 4 с маааааханькой доработкой, верней более точным выбором константы с. Корень должен задаваться из интервала локализации - это где то -4...1.2 (корней у функции вообще то 2 - см рисунок, но они зеркальные). Да да я сделал так, что можешь задавать в принципе любое значение из интервала локализации.


Не по теме:

PS:И в ообще, посомтри тему вначале: где я тебе грубил, хамил, либо ставил выше?М.б это ты начал зарываться и встретив адекватный ответ начинаешь бить словами аля "ну покажи тогда". Я то покажу, но только зачем оно мне надо - снова выслушать негатив в свой адрес?Ты бы сам стал кому то помагать с такими раскладами?Подчеркну будешь хамить дальше - я развернусь и больше никогда не зайду в эту тему(!) дел у меня и без тебя хватает...

Миниатюры
Метод простых итераций   Метод простых итераций   Метод простых итераций  

Вложения
Тип файла: rar simpliter.rar (50.6 Кб, 21 просмотров)
Yandex
Объявления
09.11.2012, 11:28     Метод простых итераций
Ответ Создать тему
Опции темы

Текущее время: 19:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru