1 / 1 / 0
Регистрация: 25.10.2014
Сообщений: 21
1

Нахождение корня нелинейного уравнения методом итерации

06.01.2015, 11:00. Показов 6480. Ответов 11
Метки нет (Все метки)

Прошу помочь разобраться в ошибке. Есть рабочий код с++ для нахождения корня методом итерации уравнения (cosh(0.7*x)-9)/3.5. Но при подстановке иного уравнения pow(x,3)-0.2*pow(x,2)+0.5*x+1.5 (а именно оно и необходимо) выдает, что корень равен бесконечности. В чем соль метода? В чем разница? Код прилагается:

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
#include <iostream>
#include <math.h>
 
using namespace std;
 
//уравнение для которого ищем корень
double F(double x) {
    return (cosh(0.7*x)-9)/3.5;
}
 
int main()
{
    double x0,xn,b;
    const double eps = 0.0001;//точность вычисления корня
    x0 = -2;//задаём начальное приближение
    const int maxiter=100;//максимально количество итераций
    int n = 0;
    do {
        xn=F(x0);//вычисляем очередное приближение
        b=fabs(x0-xn);//находим разницу между предыдущей итерацией и текущей
        x0=xn;//предыдущую итерацию ставим = текущей,для нахождения последующего приблежения
        n++;//увеличиваем счётчик итераций
        //если разница между предыдущей итерацией и текущей больше или равна заданной точности и 
        //количество проделанных итераций меньше maxiter,то продолжаем поиск
    } while (b>=eps && n<=maxiter);
    if (n>maxiter) cout << "Не сошлось за " << maxiter << " итерцаий\n";
    else cout << "x = " << xn << "\n";
    system("pause");
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2015, 11:00
Ответы с готовыми решениями:

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

Решение нелинейного уравнения методом итерации
Написал программу решение нелинейного уравнения методом итерации: //Метод итерации #include...

Решение нелинейного уравнения методом простой итерации
Помогите, пожалуйста! Нужно разработать программу для решения нелинейного уравнения методом простой...

Нахождение корня уравнения методами дихотомии и итерации
Решить уравнение sin(x+p/3) - 0,5x = 0 на отрезке с точностью e методами дихотомии и итерации....

11
122 / 24 / 6
Регистрация: 31.12.2014
Сообщений: 164
06.01.2015, 12:12 2
Цитата Сообщение от Statussrg Посмотреть сообщение
Прошу помочь разобраться в ошибке. Есть рабочий код с++ для нахождения корня методом итерации уравнения (cosh(0.7*x)-9)/3.5. Но при подстановке иного уравнения pow(x,3)-0.2*pow(x,2)+0.5*x+1.5 (а именно оно и необходимо) выдает, что корень равен бесконечности. В чем соль метода? В чем разница? Код прилагается:

#include <iostream>
#include <math.h>

using namespace std;

//уравнение для которого ищем корень
double F(double x) {
return (cosh(0.7*x)-9)/3.5;
}

int main()
{
double x0,xn,b;
const double eps = 0.0001;//точность вычисления корня
x0 = -2;//задаём начальное приближение
const int maxiter=100;//максимально количество итераций
int n = 0;
do {
xn=F(x0);//вычисляем очередное приближение
b=fabs(x0-xn);//находим разницу между предыдущей итерацией и текущей
x0=xn;//предыдущую итерацию ставим = текущей,для нахождения последующего приблежения
n++;//увеличиваем счётчик итераций
//если разница между предыдущей итерацией и текущей больше или равна заданной точности и
//количество проделанных итераций меньше maxiter,то продолжаем поиск
} while (b>=eps && n<=maxiter);
if (n>maxiter) cout << "Не сошлось за " << maxiter << " итерцаий\n";
else cout << "x = " << xn << "\n";
system("pause");
return 0;
}
Доброе утро!
1) читали ли вы хоть где-нибудь, что такое метод итерации? Если я правильно понимаю, тут (да и вообще на любом тематическом сайте) написано, что должно быть вместо вашего F: http://ru.m.wikipedia.org/wiki... й_итерации
0
Модератор
Эксперт С++
12105 / 9776 / 5910
Регистрация: 18.12.2011
Сообщений: 26,247
06.01.2015, 12:43 3
1. Надо свести уравнение к виду x=f(x):
x=-2x3+0.4x2-3.
2. Условие сходимости fabs(f'(x))<1
f'(x)=-6x2+0.8x
Т.е. x0=-2 не годится
Можно начать с x0=0
1
1 / 1 / 0
Регистрация: 25.10.2014
Сообщений: 21
06.01.2015, 13:40  [ТС] 4
Подскажите как дальше использовать в коде приведенное к нужному виду уравнение.
0
Модератор
Эксперт С++
12105 / 9776 / 5910
Регистрация: 18.12.2011
Сообщений: 26,247
06.01.2015, 13:48 5
Так, как Вы делали - заменить фунцию F:
C++
1
2
3
4
double F(double x)
{
    return -2.*x*x*x+0.4*x*x-3.0;
}
0
122 / 24 / 6
Регистрация: 31.12.2014
Сообщений: 164
06.01.2015, 14:50 6
Цитата Сообщение от zss Посмотреть сообщение
Так, как Вы делали - заменить фунцию F:
C++
1
2
3
4
double F(double x)
{
    return -2.*x*x*x+0.4*x*x-3.0;
}
Хм.. А там не должно еще прибавляться x? Ведь по сути когда f(x) станет примерно равным x, получится, что x не корень f(x), а принимает захначение примерно x.
0
Модератор
Эксперт С++
12105 / 9776 / 5910
Регистрация: 18.12.2011
Сообщений: 26,247
06.01.2015, 14:56 7
Нам и нужно найти такое x, что f(x)=x
Еще раз:
Вы запоминаете старое значение ( x0=xn; )
Вы вычисляете y=f(x);
А xn присваиваете y ( xn=y; )
и повторяете до тех пор, пока старое и новое x не станут почти одинаковыми
fabs(x0-xn)<eps
0
122 / 24 / 6
Регистрация: 31.12.2014
Сообщений: 164
06.01.2015, 14:57 8
Цитата Сообщение от zss Посмотреть сообщение
Еще раз:
Вы вычисляете y=f(x);
Потом запоминаете старое значение x
А x присваиваете y ( x=y; )
и повторяете до тех пор, пока старое и новое x не станут почти одинаковыми
Да, и в итоге что получится? Что x=f(x), но это же не корень!
0
Модератор
Эксперт С++
12105 / 9776 / 5910
Регистрация: 18.12.2011
Сообщений: 26,247
06.01.2015, 15:02 9
Как это не корень!!!!
Левая часть равна правой, значит, корень!
Преобразуйте снова к x3-0.2x2+0.5x+1.5
и убедитесь, что это выражение равно нулю.
0
122 / 24 / 6
Регистрация: 31.12.2014
Сообщений: 164
06.01.2015, 15:04 10
А, у вас f обозначает не то, что в условии у автора. Ладно, поставлю вопрос иначе. Откуда оно у вас такое вышло?


UPD: да, правильно ли я понимаю, что автор хочет решить такое уравнение: https://www.cyberforum.ru/cgi-bin/latex.cgi?x^3-0,2x^2+0,5x+1,5 = 0? А то может я и условие не так понял?

UPD2: я понял, что вы сделали, спасибо!
0
Модератор
Эксперт С++
12105 / 9776 / 5910
Регистрация: 18.12.2011
Сообщений: 26,247
06.01.2015, 15:09 11
Цитата Сообщение от ltkj Посмотреть сообщение
Откуда оно у вас такое вышло?
1. Переносим 0.5x в правую часть
x3-0.2x2+1.5=-0.5x
2. Делим на -0.5
-2x3+0.4x2-3=x
0
122 / 24 / 6
Регистрация: 31.12.2014
Сообщений: 164
06.01.2015, 15:15 12
Цитата Сообщение от zss Посмотреть сообщение
1. Переносим 0.5x в правую часть
x3-0.2x2+1.5=-0.5x
2. Делим на -0.5
-2x3+0.4x2-3=x
Да, уже понял, спасибо больше. Сначала думал, у вас f = что в условии, потому долго не понимал, как ЭТО может быть корнем. А потом стала неожиданной мысль о том, что x можно вот так взять и выразить. Никогда такого удачного примера(многочлена) не встречал, всегда в лучшем случае Ньютон получался.

Добавлено через 3 минуты
И да, я всё равно не понял, как может работать тот рабочий код из 1 сообщения..
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.01.2015, 15:15
Помогаю со студенческими работами здесь

Приближённое значение корня уравнения методом деления отрезка пополам и методом итерации
Методом деления отрезка пополам и методом итераций найти приближённое значение корня уравнения...

Расчёт корня нелинейного уравнения (Методом итераций)
Всем доброго дня очень нужно записать на С++ программу которая находит корень нелинейного...

Вычисление корня нелинейного уравнения методом Золотого сечения.
Всем вечер добрый, нужен алгоритм поиска корня нелинейного уравнения методом Золотого сечения....

Составить программу нахождения корней нелинейного уравнения методом простой итерации с точностью вычисления E
Помогите Составить программу нахождения корней нелинейного уравнения методом простой итерации с...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru