Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Glants
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 5
#1

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

05.10.2016, 14:24. Просмотров 1433. Ответов 9
Метки нет (Все метки)

Дана функция 1.4 Cos[3.9 x] - Log[2.5 x]=0
Ее надо преобразовать к виду ф(x)=x, я не совсем понимаю как это сделать
нужно написать программу в 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*Задание 2. Вариант 10.*/
 
 
#include <iostream>
#include <cmath> 
#include <stdlib.h>
#include <math.h>
#include <iomanip>
 
using namespace std;
 
double initial(double x)
{
    return 1.4*cos(3.9*x) - log(2.5*x);
}
 
double transformed(double x)
{
    /*return (exp(1.4*cos(3.9*x)) / 2.5);*/
    return (acos(log(2.5*x) / 5.46));
    /*return 1.4*cos(3.9*x) - log(2.5*x) + x; */
}                                            
 
 
double PD(double a, double b, double e, int &count);
double MI(double a, double b, double e, int &count);
 
void main()
{
    setlocale(LC_ALL, "rus");
    double a, b, e;
    int count = 0;
 
    cout << "Введите погрешность вычислений: ";
    cin >> e;
 
    cout << endl << "Метод половинного деления." << endl;
    cout << "Введите предел a: "; cin >> a; cout << "Введите предел b: "; cin >> b;
    cout << "Корень данного уравнения на [" << a << "," << b << "]";
 
    double result = PD(a, b, e, count);
    cout << " с погрешностью " << e << ": " << setprecision(8) << result << endl << "При числе итераций: " << count << "\n";
 
    count = 0;
    cout << endl << "Метод простых итераций." << endl;
    cout << "Введите предел a: "; cin >> a; cout << "Введите предел b: "; cin >> b;
    cout << "Корень данного уравнения на [" << a << "," << b << "]";
        double resultat = MI(a, b, e, count);
        cout<< " с погрешностью " << e << ": " << setprecision(8) << resultat << endl << "При числе итераций: " << count << "\n";
 
    system("pause");
}
 
double  PD(double a, double b, double e, int &count)
{
    count = 0;
    double x = 0;
    if (initial(a)*initial(b) >= 0 || a > b)
    {
        cout << "Неверные пределы! На данном промежутке нет корней или корень не является единственным." << endl;
        return 0;
    }
    while (b - a > e)
    {
        x = (a + b) / 2;
        if (initial(a) * initial(x) < 0) b = x;
        else a = x;
        count++;
    }
    return (a + b) / 2;
}
double MI(double a, double b, double e, int &count)
{
    count = 0;
    double x = 0;
    double y = b / 2;
    while (abs(y - x) > e)
    {
        x = y;
        y = transformed(x);
        count++;
    } 
    return x;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2016, 14:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Метод простых итераций (C++):

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

Метод простых итераций
Необходимо реализовать программно метод простых итерация для решения НУ. к...

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

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

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

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

9
regio1961
130 / 130 / 110
Регистрация: 06.06.2016
Сообщений: 322
05.10.2016, 15:34 #2
Цитата Сообщение от Glants Посмотреть сообщение
Дана функция 1.4 Cos[3.9 x] - Log[2.5 x]=0
Ее надо преобразовать к виду ф(x)=x, я не совсем понимаю как это сделать
Например

http://www.cyberforum.ru/cgi-bin/latex.cgi?1.4 \cos[3.9 x] - \log[2.5 x] = 0 \qquad \rightarrow \qquad 1.4 \cos[3.9 x] - \log[2.5 x] + x = x

Для функции

http://www.cyberforum.ru/cgi-bin/latex.cgi?\varphi(x) = 1.4 \cos[3.9 x] - \log[2.5 x] + x

Нужно проверить условие сходимости

http://www.cyberforum.ru/cgi-bin/latex.cgi? |\varphi'(x)| \, < \, 1
0
Glants
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 5
05.10.2016, 16:34  [ТС] #3
То есть мне просто надо найти производную? от ф(x)?
0
regio1961
130 / 130 / 110
Регистрация: 06.06.2016
Сообщений: 322
05.10.2016, 16:40 #4
Вам нужно проверить, что модуль производной меньше единицы, тогда метод простых итераций сходится.
0
Glants
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 5
05.10.2016, 16:50  [ТС] #5
Извините, но вы не могли кратко объяснить как проверить то что модуль производной меньше единицы?
0
regio1961
130 / 130 / 110
Регистрация: 06.06.2016
Сообщений: 322
05.10.2016, 17:47 #6
Вначале нужно отделить корни (для данного уравнения их несколько), начертите график или сделайте это аналитически, а затем для x вблизи корня (это будет начальным приближением) считайте

http://www.cyberforum.ru/cgi-bin/latex.cgi?\varphi'(x) = -1.4 \cdot 3.4 \cdot \sin (3.9x) -  \dfrac{1}{x} + 1 = -4.76 \, sin (3.9x) - \dfrac{1}{x} + 1

Если эта величина по модулю < 1, можно применять метод простых итераций. Если же это не так можно выбрать функцию http://www.cyberforum.ru/cgi-bin/latex.cgi?\varphi иначе, так чтобы

http://www.cyberforum.ru/cgi-bin/latex.cgi? |\varphi'(x)| \, < \, 1.
0
Вложения
Тип файла: pdf 0.pdf (11.8 Кб, 14 просмотров)
Тип файла: pdf 1.pdf (10.9 Кб, 6 просмотров)
Glants
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 5
08.10.2016, 11:02  [ТС] #7
Так как x=0.40190026, получается что модуль ф'(x) >1
Значит надо по другому привести к виду ф(х)??
0
regio1961
130 / 130 / 110
Регистрация: 06.06.2016
Сообщений: 322
08.10.2016, 19:51 #8
Да.
0
Glants
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 5
09.10.2016, 12:37  [ТС] #9
Так, каким же способом можно задать ф(x)? И еще один вопрос, я просто не особо понял алгоритм метода итераций, я понял что я должен лишь сделать проверку |ф'(x)|<1, но я не понял саму суть этого метода? Вы не могли бы объяснить?
0
regio1961
130 / 130 / 110
Регистрация: 06.06.2016
Сообщений: 322
09.10.2016, 15:54 #10
Цитата Сообщение от Glants Посмотреть сообщение
я не понял саму суть этого метода? Вы не могли бы объяснить?
Читайте любую книжку по численным методам.
0
09.10.2016, 15:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2016, 15:54
Привет! Вот еще темы с решениями:

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

Метод простых итераций для СЛАУ
Доброго времени суток всем!!! решаю СЛАУ методом простых итераций, проблема...

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

Метод простых итераций для одного уравнения
arccos(x) - sqrt(1-0.3x^3) = 0 Отрезок от +приближенное значение корня...


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

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

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