Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.96/28: Рейтинг темы: голосов - 28, средняя оценка - 4.96
pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
1

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

04.11.2012, 01:24. Просмотров 5041. Ответов 14
Метки нет (Все метки)

Необходимо реализовать программно метод простых итерация для решения НУ.
к примеру возьмём 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 определять автоматом...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2012, 01:24
Ответы с готовыми решениями:

Посчитать количество проведенных итераций (метод простых итераций, Pascal -> C++)
перевести из паскаля в С++ program method_of_simple_iteration; uses crt;...

Метод простых итераций
Здраствуйте! Нужно методом простой итерации решать такую систему нелинейных...

Метод простых итераций
Помогите с написанием программы на С++, нужно решить СЛАУ методом простых...

Метод простых итераций. С/С++
Такое задание: написать алгоритм численного решения нелинейных уравнений...

Метод простых итераций
Дана функция 1.4 Cos - Log=0 Ее надо преобразовать к виду ф(x)=x, я не совсем...

14
-=ЮрА=-
Заблокирован
Автор 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;
}
0
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
0
-=ЮрА=-
Заблокирован
Автор 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;
}
1
Миниатюры
Метод простых итераций  
pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
06.11.2012, 01:41  [ТС] 5
Неа, не убедительно ))
Нам препод говорит, c = выбирается таким образом, дабы производная фи была < 1...
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.11.2012, 02:02 6
Цитата Сообщение от pavel1992 Посмотреть сообщение
Нам препод говорит, c = выбирается таким образом, дабы производная фи была < 1...
- какая чёрт возьми производная в методе простых итераций?!

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

Не по теме:

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

0
pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
06.11.2012, 13:35  [ТС] 7
Дядя, за помощь тебе спасибо, но! Я тебе грубил? Какого ты гонишь на меня?
Не я это придумал, и не упрекаю я тебя ни в чём.
А вот книга что говорит:
Метод простых итераций

(и что нет производной в теме, да?)
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.11.2012, 13:56 8
Цитата Сообщение от pavel1992 Посмотреть сообщение
(и что нет производной в теме, да?)
- пишешь название скрина для клоуна, хорошо сейчас я покажу кто из нас клоун
В первой части твоего скрина написано о выборе интрвала изоляции корня которое должно удовлетворять условию |g'(x)| < q < 1 где q - это просто константа. Ты сам определил в задаче нужный интервал изоляции корня
Цитата Сообщение от pavel1992 Посмотреть сообщение
интервал изоляции корня [-2,0].
. А теперь раззуй свои глаза да почитай схему метода,
x = x + c*f(x) где c - произвльное число
я тебе даже на втоём скрине красным обвёл чтобы не дай бог ты не сбился.
И в схеме решения нет никакой производной. И кто из нас клоун, м?
1
Миниатюры
Метод простых итераций  
-=ЮрА=-
Заблокирован
Автор 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))

Не по теме:

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

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

Не по теме:

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

0
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 итерационный процесс сходится? Ну ну...
Читать тут:
Кликните здесь для просмотра всего текста
А мы что тут собрались пиписяками мерятся или что? Для того и существует форум, чтобы из "балбесов" сделать образованных людей. Что за манера ставить себя выше?
0
-=ЮрА=-
Заблокирован
Автор FAQ
08.11.2012, 22:55 13
pavel1992, если б ты умел читать,нашел бы критерии выбора константы с в моих постах.PS:Есть неписаная истина-в руках туземца даже ПК всего лишь груда металлолома. Аналогии проводи сам...
0
pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
08.11.2012, 23:33  [ТС] 14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
pavel1992, если б ты умел читать,нашел бы критерии выбора константы с в моих постах.PS:Есть неписаная истина-в руках туземца даже ПК всего лишь груда металлолома. Аналогии проводи сам...
Вот именно.... Посмотри, что даж поиском решения подобрать так c, дабы на всём промежутке fi`(x) -2;0 0<q<1 нифига не получается...
Продемонстрируй конкретно... А не продолжай глаголить какой я болван.
0
-=ЮрА=-
Заблокирован
Автор 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:И в ообще, посомтри тему вначале: где я тебе грубил, хамил, либо ставил выше?М.б это ты начал зарываться и встретив адекватный ответ начинаешь бить словами аля "ну покажи тогда". Я то покажу, но только зачем оно мне надо - снова выслушать негатив в свой адрес?Ты бы сам стал кому то помагать с такими раскладами?Подчеркну будешь хамить дальше - я развернусь и больше никогда не зайду в эту тему(!) дел у меня и без тебя хватает...

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

Вложения
Тип файла: rar simpliter.rar (50.6 Кб, 25 просмотров)
09.11.2012, 11:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 11:28

Метод простых итераций для СЛАУ
Прошу помочь с написанием МПИ для СЛАУ на C. Каким образом выразить из AX=b...

Метод простых итераций для СЛАУ
Здравствуйте! Пытаюсь реализовать метод простых итераций. Все функции, которые...

Метод простых итераций для СЛАУ
Помогите пожалуйста! Нужно реализовать метод простых итераций для решения СЛАУ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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