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

Численные методы решения нелинейного уравнения - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Инициализация класса, возврат значений http://www.cyberforum.ru/cpp-beginners/thread1494898.html
Сама задача: Реализовать класс Rectangle. Класс должен хранить координаты, а так же длину и ширину прямоугольника. Предусмотреть инициализацию данного класса через конструктор по умолчанию и с помощью координат двух противоположных вершин. Общими должны быть методы, которые возвращают координаты прямоугольника (x1, x2, y1, y2), длину, ширину, площадь, а также методы позволяющие изменять...
C++ После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? class abc { public: int argc; char **argv; char **azColName; }; std::list<abc> Result; http://www.cyberforum.ru/cpp-beginners/thread1494884.html
Задача по ООП C++
Помогите решить задачу. Есть следующий набор типов документов: 1. Паспорт. Атрибуты: Фамилия, Имя, отчество, Номер, Серия, Дата выдачи. 2. Свидетельство о регистрации брака. Атрибуты: Дата регистрации, Орган регистрации, Паспорт мужа, Паспорт Жены. Написать программу по вводу и редактированию этих данных. Использовать ООП. В программе (БД) должно быть предусмотрено, что...
C++ Ошибка: Run-Time Check Failure #3 - The variable 'i' is being used without being initialized
в чём ошибка (просьба подправить) #include "stdafx.h" #include <math.h> #include <iostream> #include <fstream> using namespace std; int factorial(int n) { int result = 1; for ( int i = 2; i <= n; i++ ) {
C++ Сохранение файла под указанным пользователем именем http://www.cyberforum.ru/cpp-beginners/thread1494875.html
у меня есть функция, которая сохраняет редактируемый файл и выходит: void shift_f10(char *filename) { FILE *f1; /*Редактируемый файл*/ int i,j; /*Счетчики*/ unsigned char buf; /*Буферная строка для считывания из файла*/ WORD attrib; /*Атрибуты ячеек экранного буфера*/ COORD position; /*Кординаты начала вывода (атрибутов)*/ DWORD numattrib; /*Количество...
C++ Найти максимальную площадь треугольника по двум его сторонам Формат ввода Первая строка ввода содержит два целых числа A и B (1 ≤ A, B ≤ 109) – заданные длины сторон. Формат вывода Вывести одно целое число — длина третьей стороны, при которой остроугольный треугольник с этими сторонами имеет максимальную площадь. подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
09.07.2015, 01:46     Численные методы решения нелинейного уравнения
Цитата Сообщение от Drosya12 Посмотреть сообщение
При повышении точности,только,программа,почему-то не отрабатывает вовсе...
Вот так работает:
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/////////////////////////////////////////////////////////////////////////////////////////
//Решить уравнение
//cos(1.3 * x) = 1/x
//численным методом. Найти первые n корней.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <set>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                 T_str;
typedef std::set    < double    >   T_roots;
/////////////////////////////////////////////////////////////////////////////////////////
const   int     EPS_EXP     =   12;
const   double  EPS         =   pow( 10.0, -EPS_EXP );
const   double  STEP        =   0.1;
const   T_str   EQ_STR  =   "cos(1.3 * x) = 1/x";
/////////////////////////////////////////////////////////////////////////////////////////
double  f( double   x )
{
    return  cos( 1.3 * x ) - 1 / x;
}
/////////////////////////////////////////////////////////////////////////////////////////
double  get_root_in_segment
    (
        double  L,
        double  R
    )
{
    while   (
                    abs (
                            f(R) - f(L)
                        )
 
                >   EPS
            )
    {
        double  M   =   (L + R) / 2;
 
        f(M) * f(L)     <   0
            ?   R   =   M
            :   L   =   M;
    }//while
 
    return  L;
}
/////////////////////////////////////////////////////////////////////////////////////////
double  get_root_to_right_of( double   L )
{
    if  (
            f(L) == 0
        )
    {
        return  L;
    }
 
    double  R   =   L;
 
    while   (
                f(L) * f(R)     >=  0
            )
    {
        R   +=  STEP;
    }
 
    return  get_root_in_segment( L, R );
}
/////////////////////////////////////////////////////////////////////////////////////////
T_roots     get_n_positive_roots( int    n )
{
    T_roots     res_roots;
    double      root    =   0;
 
    for( int  i = 0; i < n; ++i )
    {
        root    =   get_root_to_right_of( root + STEP );
        res_roots.insert( root );
    }//for
 
    return  res_roots;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    print_roots( T_roots    const   &   roots )
{
    std::cout   <<  std::endl
                <<  "Первые "
                <<  roots.size()
                <<  " положительных корней уравнения "
                <<  EQ_STR
                <<  ":"
                <<  std::endl;
 
    std::for_each
        (
            roots.begin     (),
            roots.end       (),
 
            []              ( double    root )
            {
                static  int     counter     =   0;
 
                std::cout   <<  '#'
                            <<  ++counter
                            <<  "\t"
                            <<  "f( "
                            <<  std::fixed
                            <<  std::setprecision( EPS_EXP + 2 )
                            <<  root
                            <<  "\t) = "
                            <<  f( root )
                            <<  std::endl;
            }
        );
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
 
    std::cout   <<  "Введите количество искомых положительных корней уравнения"
                <<  std::endl
                <<  EQ_STR
                <<  ": ";
 
    int         n   =   0;
    std::cin    >>  n;
    T_roots     roots   =   get_n_positive_roots( n );
    print_roots     ( roots );
    system          ("pause");
}
Добавлено через 1 час 17 минут
А еще правильнее вот так будет:
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/////////////////////////////////////////////////////////////////////////////////////////
//Решить уравнение
//cos(1.3 * x) = 1/x
//численным методом. Найти первые n корней.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <limits>
#include <set>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                 T_str;
typedef std::set    < double    >   T_roots;
/////////////////////////////////////////////////////////////////////////////////////////
const   int     EPS_EXP     =   12;
const   double  EPS         =   pow( 10.0, -EPS_EXP );
const   double  STEP        =   0.1;
const   T_str   EQ_STR  =   "cos(1.3 * x) = 1/x";
/////////////////////////////////////////////////////////////////////////////////////////
double  f( double   x )
{
    return  cos( 1.3 * x ) - 1 / x;
}
/////////////////////////////////////////////////////////////////////////////////////////
double  get_root_in_segment
    (
        double  L,
        double  R
    )
{
    while   (
                    R - L   >   std::max    (
                                                EPS,
                                                abs( R )    *   std::numeric_limits < double >::epsilon()
                                            )
            )
    {
        double  M   =   (L + R) / 2;
 
        f(M) * f(L)     <   0
            ?   R   =   M
            :   L   =   M;
    }//while
 
    return  L;
}
/////////////////////////////////////////////////////////////////////////////////////////
double  get_root_to_right_of( double   L )
{
    if  (
            f(L) == 0
        )
    {
        return  L;
    }
 
    double  R   =   L;
 
    while   (
                f(L) * f(R)     >=  0
            )
    {
        R   +=  STEP;
    }
 
    return  get_root_in_segment( L, R );
}
/////////////////////////////////////////////////////////////////////////////////////////
T_roots     get_n_positive_roots( int    n )
{
    T_roots     res_roots;
    double      root    =   0;
 
    for( int  i = 0; i < n; ++i )
    {
        root    =   get_root_to_right_of( root + STEP );
        res_roots.insert( root );
    }//for
 
    return  res_roots;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    print_roots( T_roots    const   &   roots )
{
    std::cout   <<  std::endl
                <<  "Первые "
                <<  roots.size()
                <<  " положительных корней уравнения "
                <<  EQ_STR
                <<  ":"
                <<  std::endl;
 
    std::for_each
        (
            roots.begin     (),
            roots.end       (),
 
            []              ( double    root )
            {
                static  int     counter     =   0;
 
                std::cout   <<  '#'
                            <<  ++counter
                            <<  "\t"
                            <<  "f( "
                            <<  std::fixed
                            <<  std::setprecision( EPS_EXP + 2 )
                            <<  root
                            <<  "\t) = "
                            <<  f( root )
                            <<  std::endl;
            }
        );
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
 
    std::cout   <<  "Введите количество искомых положительных корней уравнения"
                <<  std::endl
                <<  EQ_STR
                <<  ": ";
 
    int         n   =   0;
    std::cin    >>  n;
    T_roots     roots   =   get_n_positive_roots( n );
    print_roots     ( roots );
    system          ("pause");
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru