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

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

05.10.2016, 14:24. Просмотров 1888. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

9
regio1961
134 / 133 / 111
Регистрация: 06.06.2016
Сообщений: 331
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
Сообщений: 6
05.10.2016, 16:34  [ТС] 3
То есть мне просто надо найти производную? от ф(x)?
0
regio1961
134 / 133 / 111
Регистрация: 06.06.2016
Сообщений: 331
05.10.2016, 16:40 4
Вам нужно проверить, что модуль производной меньше единицы, тогда метод простых итераций сходится.
0
Glants
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 6
05.10.2016, 16:50  [ТС] 5
Извините, но вы не могли кратко объяснить как проверить то что модуль производной меньше единицы?
0
regio1961
134 / 133 / 111
Регистрация: 06.06.2016
Сообщений: 331
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 Кб, 15 просмотров)
Тип файла: pdf 1.pdf (10.9 Кб, 7 просмотров)
Glants
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 6
08.10.2016, 11:02  [ТС] 7
Так как x=0.40190026, получается что модуль ф'(x) >1
Значит надо по другому привести к виду ф(х)??
0
regio1961
134 / 133 / 111
Регистрация: 06.06.2016
Сообщений: 331
08.10.2016, 19:51 8
Да.
0
Glants
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 6
09.10.2016, 12:37  [ТС] 9
Так, каким же способом можно задать ф(x)? И еще один вопрос, я просто не особо понял алгоритм метода итераций, я понял что я должен лишь сделать проверку |ф'(x)|<1, но я не понял саму суть этого метода? Вы не могли бы объяснить?
0
regio1961
134 / 133 / 111
Регистрация: 06.06.2016
Сообщений: 331
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...

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


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

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

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