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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
ScaleS
46 / 46 / 0
Регистрация: 06.12.2009
Сообщений: 68
#1

Нахождение корней уравнения - C++

07.12.2009, 00:56. Просмотров 58157. Ответов 44

Задачи решенные тремя разными способами

Метод итераций
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
#include <conio.h>
#include <math.h>
#include <iostream.h>
#define pi 3.14
double f(double x) {
 
    return   x*x-(cos(pi*x));
}
 
double fi(double x, double L) {
 
    return  x+L*f(x);
}
 
 
int main() {
    int n=0;
    double x,y,c,b,L=-0.35,eps;
    cout<<"x="; cin>>x;
    cout<<"eps="; cin>>eps;
    do {
        y=fi(x,L);
        b=fabs(x-y);
        x=y;
        n+=1;
    }
    while (b>=eps);
        cout<<"c="<<x<<"\n";
        cout<<"n="<<n<<"\n";
        getch();
    return 0;
}


Метод Ньютона
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
#include <conio.h>
#include <math.h>
#include <iostream.h>
#define pi 3.14
 
double f(double x) {
 
    return   x*x-(cos(pi*x));
}
 
double f1(double x) {
 
    return   2*x+(1/x);
}
 
double f2(double x) {
 
    return   2+(-1/(x*x));
}
 
int main() {
    int n=0;
    double a,b,c,eps;
    cout<<"a="; cin>>a;
    cout<<"b="; cin>>b;
    cout<<"eps="; cin>>eps;
    if(f(a)*f2(a)>0) c=a;
    else c=b;
    do {
        c=c-f(c)/f1(c);
        n+=1;
    }
    while (fabs(f(c))>=eps);
        cout<<"c="<<c<<"\n";
        cout<<"n="<<n<<"\n";
        getch();
    return 0;
}


Метод половинного деления
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
#include <conio.h>
#include <math.h>
#include <iostream.h>
#define pi 3.14
 
double f(double x) {
 
    return   x*x-(cos(pi*x));
}
int main() {
    int n=0;
    double a,b,c,eps;
    cout<<"a="; cin>>a;
    cout<<"b="; cin>>b;
    cout<<"eps="; cin>>eps;
    do {
        c=(a+b)/2;
        if (f(c)*f(a)<=0) b=c;
        else a=c;
 
        n+=1;
 
    }
    while (fabs(a-b)>=eps);
        cout<<"c="<<c<<"\n";
        cout<<"n="<<n<<"\n";
        getch();
    return 0;
}
46
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2009, 00:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нахождение корней уравнения (C++):

Нахождение корней уравнения - C++
Программа находит все корни уравнения и записывает в динамический массив. #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;iostream&gt;...

Нахождение корней уравнения - C++
Помогите написать программу по выводу корней из уравнения: f(x)=4\ast \sin \left(x \right)^4+2\ast \cos \left(x \right)^3+2 &quot;Шапку&quot; я...

Нахождение корней квадратного уравнения - C++
Здравствуйте , показывает ошибку в этих строчках,ругается на функции sqrt и pow объясните почему именно, заранее спасибо z =...

Нахождение корней квадратного уравнения С++ - C++
Как найти корни квадратного уравнения С++?Задаются ведь значения x.y.z,а на выходе выводится значение корней. С++.Новичок.Буду...

Нахождение корней квадратного уравнения - C++
Здравствуйте все кто читает эти строки! Большой привет вам из раздела Delphi! Моему другу появилось необходимость написать прогу на...

Нахождение корней уравнения методом обратного интерполирования - C++
Pomogite pojaluista napisat na C++ . . . zARANEE sPASIBO :)))

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
07.12.2009, 02:03 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Раз создана такая тема, то у меня тоже есть парочка методов

Дихотомии(половинного деления)
C++
1
2
3
4
5
6
7
8
9
10
11
double dichotomy(double infinum, double supremum, double epsilon) {
   double x;
   while (supremum - infinum > epsilon) {
      x = (infinum + supremum) / 2;
      if (func(supremum) * func(x) < 0)
         infinum = x;
      else
         supremum = x;
   }
   return (infinum + supremum) / 2;
}


Золотого сечения
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
#include <iostream>
#define eps 1e-3
#define tay 1.618
 
void Gold(double a, double b)
{
    std::cout<<"\n\n\n\tМетод золотого сечения:\n";
    double x1, x2, _x, xf1, xf2;
    int iter(0);
    x1 = a + (b - a) / (tay * tay);
    x2 = a + (b - a) / tay;
    xf1 = Fun(x1);
    xf2 = Fun(x2);
  P:
    iter++;
    if(xf1 >= xf2)
    {
        a = x1;
        x1 = x2;
        xf1 = Fun(x2);
        x2 = a + (b - a) / tay;
        xf2 = Fun(x2);
    }
    else
    {
        b = x2;
        x2 = x1;
        xf2 = xf1;
        x1 = a + (b - a) / (tay * tay);
        xf1 = Fun(x1);
    }
    if(fabs(b - a) < eps) 
    {
        _x = (a + b) / 2;
        std::cout<<"Результат:\nx = "<<_x<<"\t\tF(x) = "<<Fun(_x)<<
            "\nКоличество итераций: "<<iter;
    }
    else
        goto P;
}


Фибоначчи
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
#include <iostream>
#define eps 1e-3
int F(int n)
{
    int f, f1(1), f2(1), m(0);
    while(m < n - 1)
    {
        f = f1 + f2;
        f1 = f2;
        f2 = f;
        ++m;
    }
    return f1;
}
void Fib(double a, double b)
{
    std::cout<<"\n\n\n\tМетод Фибоначчи:\n";
    double x1, x2, _x, xf1, xf2;
    int k(0);
    int N(0);
    double fn1(1), fn2(1), fn, f = (b - a) / eps;
    while(fn1 < f)
    {
        fn = fn1 + fn2;
        fn1 = fn2;
        fn2 = fn;
        ++N;
    }
    x1 = a + (double)F(N - 2) / F(N) * (b - a) - (N&1 ? -1 : 1) * eps / F(N);
    x2 = a + (double)F(N - 1) / F(N) * (b - a) + (N&1 ? -1 : 1) * eps / F(N);
    xf1 = Fun(x1);
    xf2 = Fun(x2);
  P:
    ++k;
    if(xf1 >= xf2)
    {
        a = x1;
        x1 = x2;
        xf1 = xf2;
        x2 = a + (double)F(N - k - 1) / F(N - k) * (b - a) + ((N - k)&1 ? -1 : 1) * eps / F(N - k);
        xf2 = Fun(x2); 
    }
    else
    {
        b = x2;
        x2 = x1;
        xf2 = xf1;
        x1 = a + (double)F(N - k - 2) / F(N - k) * (b - a) - ((N - k)&1 ? -1 : 1) * eps / F(N - k);
        xf1 = Fun(x1);
    }
    if(fabs(b - a) <= eps)
    {
        _x = (a + b) / 2;
        std::cout<<"Результат:\nx = "<<_x<<"\t\tF(x) = "<<Fun(_x)<<
            "\nКоличество итераций: "<<k;
    }
    else
        goto P;
}


Метод хорд
C++
1
2
3
4
5
6
7
8
9
10
11
12
double secant(double infinum, double supremum, double epsilon)
{
    while (fabs(supremum - infinum) > epsilon)
    {
        infinum = supremum - (supremum - infinum) * func(supremum) / (func(
                supremum) - func(infinum));
        supremum = infinum - (infinum - supremum) * func(infinum) / (func(
                infinum) - func(supremum));
    }
 
    return supremum;
}


Где наше уравнение - функция
Fun
C++
1
2
3
4
double Fun(double x)
{
    return (x * x * x * x - 8 * x * x + 8 * x + 1);//здесь может быть ваше уравнение
}
и параметры a и b - границы интервала
22
Peace_DEATH
0 / 0 / 0
Регистрация: 11.05.2009
Сообщений: 15
21.12.2010, 12:30 #3
У меня вопрос по методу итераций. А можно хоть чуть-чуть комментариев? Что такое fi?
0
ivanv
0 / 0 / 0
Регистрация: 04.01.2011
Сообщений: 3
04.01.2011, 20:36 #4
Случайно нет программы для нахождения минимума не 2-ух, а 3-ёх переменных?
0
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
26.03.2011, 11:07 #5
Моя реализация метода Фибоначчи для нахождения минимума f(x) на отрезке [a;b] с точностью e.
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
double f(double x) { return -(x*x*x/3-exp(x)-2*x); }
double e = 0.001;
 
double fibo(double a, double b)
{
    unsigned int ff, n;
    double x1, x2, y1, y2;
    double fibo[3] = {0,1,1};
 
    // вычисляем 3 последних числа Фибоначчи для заданой точности
    ff = (b-a)/(2*e);
    n=3;
    while(fibo[2]<ff)
    {
        n++;
        fibo[0] = fibo[1];
        fibo[1] = fibo[2];
        fibo[2] = fibo[1] + fibo[0];
    }
 
    x1 = (b-a)*fibo[0]/fibo[2] + a;
    x2 = (b-a)*fibo[1]/fibo[2] + a;
 
    // Основной цикл
    while (n>1)
    {
        y1 = f(x1);
        y2 = f(x2);
        if (y1<=y2)
        {
            b = x2;
            x2 = x1;
            x1 = a + fibo[0]*(b-a)/fibo[2];
        } else {
            a = x1;
            x1 = x2;
            x2 = a + fibo[1]*(b-a)/fibo[2];
        }
 
        fibo[2] = fibo[1];
        fibo[1] = fibo[0];
        fibo[0] = fibo[2] - fibo[1];
        n--;
    }
 
    return (a+b)/2;
}
1
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
10.06.2011, 00:43 #6
Доброго времени суток. Могли бы вы добавить комментарии к кодировке в первом посту? Для чего каждая вызываемая переменная (допустим как в методи итераций - L) ну и подробнее прокомментировать формулу? Разумеется не нужно комментировать ввод\ввывод))
0
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
10.06.2011, 06:55 #7
opi, см. ответ на сообщение №3 этой темы.
1
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
10.06.2011, 11:16 #8
я то прочел, но кроме поставленного вопроса я ничего больше не вижу =\
0
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
10.06.2011, 12:50 #9
Цитата Сообщение от opi Посмотреть сообщение
поставленного вопроса я ничего больше не вижу
Хорошо. Вопрос. Увидите ли Вы ответ на свой вопрос в этой теме?
0
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
10.06.2011, 12:59 #10
ммм.... кроме:
Где наше уравнение - функция Fun и параметры a и b - границы интервала
больше ничего не вижу. Не проще ли просто ответить на мой вопрос?
2
Fellan
1 / 1 / 0
Регистрация: 01.05.2011
Сообщений: 4
09.09.2011, 11:11 #11
Возможно я ошибаюсь, но по моему fi это эквивалент функции f, L это любое произвольно малое число (чтобы ряд разложить), причем при выборе числа надо учитывать, что метод применим при производной |(fi)'| <1 на заданном интервале, ну т е где мы ищем корень))
Прошу прощения если что-то не так написал, как уж понял..
1
IIIa66uMEM6eP
заставил Бендера
436 / 292 / 10
Регистрация: 05.12.2010
Сообщений: 1,645
Записей в блоге: 6
24.09.2011, 09:46 #12
есть ли у кого то решение для метода хорд и касательных? так называемый комбинированный метод
0
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 658
10.03.2012, 14:15 #13
M128K145 мне нужно решить уравнение: x * x * x * x - 4 * x * x + 8 методом Фибоначчи. Я использовал:
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
#include <iostream>
#define eps 1e-3
int F(int n)
{
        int f, f1(1), f2(1), m(0);
        while(m < n - 1)
        {
                f = f1 + f2;
                f1 = f2;
                f2 = f;
                ++m;
        }
        return f1;
}
double Fun(double x)
{
        return (x * x * x * x - 4 * x * x + 8);//здесь может быть ваше уравнение
}
void Fib(double a, double b)
{
        std::cout<<"\n\n\n\tМетод Фибоначчи:\n";
        double x1, x2, _x, xf1, xf2;
        int k(0);
        int N(0);
        double fn1(1), fn2(1), fn, f = (b - a) / eps;
        
        while(fn1 < f)
        {
                fn = fn1 + fn2;
                fn1 = fn2;
                fn2 = fn;
                ++N;
        }
        x1 = a + (double)F(N - 2) / F(N) * (b - a) - (N&1 ? -1 : 1) * eps / F(N);
        x2 = a + (double)F(N - 1) / F(N) * (b - a) + (N&1 ? -1 : 1) * eps / F(N);
        xf1 = Fun(x1);
        xf2 = Fun(x2);
  P:
        ++k;
        if(xf1 >= xf2)
        {
                a = x1;
                x1 = x2;
                xf1 = xf2;
                x2 = a + (double)F(N - k - 1) / F(N - k) * (b - a) + ((N - k)&1 ? -1 : 1) * eps / F(N - k);
                xf2 = Fun(x2); 
        }
        else
        {
                b = x2;
                x2 = x1;
                xf2 = xf1;
                x1 = a + (double)F(N - k - 2) / F(N - k) * (b - a) - ((N - k)&1 ? -1 : 1) * eps / F(N - k);
                xf1 = Fun(x1);
        }
        if(fabs(b - a) <= eps)
        {
                _x = (a + b) / 2;
                std::cout<<"Результат:\nx = "<<_x<<"\t\tF(x) = "<<Fun(_x)<<
                        "\nКоличество итераций: "<<k;
        }
        else
                goto P;
}
Компилятор выдал ошибку:

Error 1 error LNK1561: entry point must be defined C:\Users\Администратор\Documents\Visual Studio 2010\Projects\C++\Console\p1656\Fibonacci methode\Fibonacci methode\LINK Fibonacci methode
Как правильно определить функцию: double Fun(double x)??????? Заранее огромное спасибо.

Добавлено через 16 часов 41 минуту
Люди добрые подскажите пожалуйста куда нужно подставить определение функции
C++
1
2
3
4
double Fun(double x)
{
        return (x * x * x * x - 4 * x * x + 8);
}
для уравнения x * x * x * x - 4 * x * x + 8 в метод Фибоначчи и в метод Золотого сечения, чтобы компилятор не ругался:
Error 1 error LNK1561: entry point must be defined C:\Users\Администратор\Documents\Visual Studio 2010\Projects\C++\Console\p1656\Fibonacci methode\Fibonacci methode\LINK Fibonacci methode
2-ые сутки бьюсь????!!!!! Заранее огромное спасибо.
0
soundtrack
42 / 42 / 4
Регистрация: 15.12.2011
Сообщений: 131
18.03.2012, 13:20 #14
isaak, объяви прототипы всех функций после подключаемых файлов.

А у меня вопрос: ScaleS, насколько я понимаю, в представленных методах не хватает проверки на то, есть ли вообще на промежутке от a до b корень, так? А вообще спасибо, методы очень помогли!
0
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 658
18.03.2012, 20:24 #15
Все равно не понятно??????
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2012, 20:24
Привет! Вот еще темы с ответами:

Нахождение корней квадратного уравнения через дискриминант - C++
Здравствуйте! Начинаю работать в C++ Builder 3.1 в DOSBOXe. Стоит задача реализовать программу нахождения корней квадратного уравнения...

Нахождение корней уравнения методом обратного интерполирования - C++
Помощь нужна! кто можеть помогите

Нужен исходник с++(Нахождение корней уравнения методом обратного интерполирования) - C++
Помогите пожалуйста найти данный исходник...

Нахождение корней НУ в С++ - C++
Входными данными являются: 1. Диапазон поиска корней, т.е. минимальное и максимальное и значения х (например: от -1000 до 1000); 2....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.03.2012, 20:24
Ответ Создать тему
Опции темы

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