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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 430, средняя оценка - 4.84
ScaleS
 Аватар для ScaleS
46 / 46 / 0
Регистрация: 06.12.2009
Сообщений: 68
07.12.2009, 00:56     Нахождение корней уравнения #1
Задачи решенные тремя разными способами

Метод итераций
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;
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
16.05.2012, 00:06     Нахождение корней уравнения #21
У кого-нибудь есть работающий код минимизации функции методом кубической интерполяции на C/C++?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
urbinol
0 / 0 / 0
Регистрация: 16.06.2011
Сообщений: 151
04.09.2012, 12:07     Нахождение корней уравнения #22
а можете немножко прокомментировать метод золотого сечения..
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
04.09.2012, 14:01     Нахождение корней уравнения #23
urbinol, что именно вам не понятно?
urbinol
0 / 0 / 0
Регистрация: 16.06.2011
Сообщений: 151
04.09.2012, 19:00     Нахождение корней уравнения #24
какая переменная что обозначает
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
05.09.2012, 17:10     Нахождение корней уравнения #25
Какой код?
urbinol
0 / 0 / 0
Регистрация: 16.06.2011
Сообщений: 151
05.09.2012, 22:55     Нахождение корней уравнения #26
если можете реализуйте код на шарпе
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;
}
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
05.09.2012, 23:04     Нахождение корней уравнения #27
Цитата Сообщение от urbinol Посмотреть сообщение
реализуйте код на шарпе
вы не в том разделе, чтобы это просить. Кроме того, я не пишу на 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
#include <iostream>
#define eps 1e-3 
#define tay 1.618 // tay - пропорция золотого сечения
 
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;
}
demka
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 4
05.11.2012, 23:50     Нахождение корней уравнения #28
Нужно найти минимум функции. метод золотого сечения f(x)= (x*x) -(8/b) может кто написать с объяснениями. то что тут метод золотого сечения не работает ошибки пишет!
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
06.11.2012, 06:52     Нахождение корней уравнения #29
demka, всё должно работать. Возможно, вы не вводите значение b.
korsarqa
 Аватар для korsarqa
7 / 7 / 0
Регистрация: 06.12.2011
Сообщений: 170
27.11.2012, 19:33     Нахождение корней уравнения #30
Цитата Сообщение от ScaleS Посмотреть сообщение
Задачи рещенные тремя разными способами

Метод итераций
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;
}
Помогите пожалуйста с этим кодом. У меня функция pow(e,sqrt(x))-1/x;

Для чего тут функция fi. И что за переменная L там такая. Как мне вставить свою функцию, чтобы был результат
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
27.11.2012, 19:47     Нахождение корней уравнения #31
Цитата Сообщение от korsarqa Посмотреть сообщение
Как мне вставить свою функцию, чтобы был результат
функция f возвращает значение вашей функции в заданной точке. Вам нужно переписать return у функции f.
Для чего вообще этот код? Вы должны ответить на этот вопрос, чтобы получить ответ на все свои другие вопросы.
korsarqa
 Аватар для korsarqa
7 / 7 / 0
Регистрация: 06.12.2011
Сообщений: 170
27.11.2012, 19:52     Нахождение корней уравнения #32
Цитата Сообщение от LEQADA Посмотреть сообщение
функция f возвращает значение вашей функции в заданной точке. Вам нужно переписать return у функции f.
Для чего вообще этот код? Вы должны ответить на этот вопрос, чтобы получить ответ на все свои другие вопросы.
вы меня не поняли... Я хочу вставить свою функции вместо той, что дана в образце.
Моя функция pow(e,sqrt(x))-1/x. Подставляю

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   pow(e,sqrt(x))-1/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
double fi(double x, double L) {
 
    return  x+L*f(x);
}
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
27.11.2012, 19:56     Нахождение корней уравнения #33
korsarqa, а я не знаю, что делает этот код. Вы расскажите, я отвечу.
Tugur
Сообщений: n/a
01.01.2013, 13:46     Нахождение корней уравнения #34
Цитата Сообщение от ScaleS Посмотреть сообщение
Задачи рещенные тремя разными способами

Метод половинного деления
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;
}
как сделать чтоб несколько корней выводил ведь на отрезке могут быть другие значения!
said_ua
Сообщений: n/a
07.04.2013, 16:24     Нахождение корней уравнения #35
Цитата Сообщение от ScaleS Посмотреть сообщение
Задачи рещенные тремя разными способами

Метод итераций
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;
}
Подскажите пожалуйсата, как представленный здесь метод итерации, применить для системы из двух уравнений.
igor myakota
 Аватар для igor myakota
58 / 58 / 15
Регистрация: 03.05.2012
Сообщений: 1,202
15.05.2013, 18:50     Нахождение корней уравнения #36
Как методом итерации решить уравнение вида :exp(x)-x-20=0
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
27.10.2013, 15:49     Нахождение корней уравнения #37
Цитата Сообщение от igor myakota Посмотреть сообщение
Как методом итерации решить уравнение вида :exp(x)-x-20=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
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    setlocale(LC_ALL,"Russian");
    double x,x0,delta;
    int n;
    const double eps=0.001;
    cout <<"Введите начальное приближение для решения уравнения:\n e^X-X-20=0\n";
    cout <<"X0= ";cin >>x0;
    n=0;
    delta=0;
    do
    {
        x=log (x0+20);
        n=n+1;
        delta=fabs(x-x0);
        x0=x;
    }
    while(delta>=eps);
    cout <<"Решение уравнения Х= "<<x;
    cout <<"\nРешение найдено через "<<n<<" шагов!";
    getchar();
    getchar();
    return 0;
}
uhuy
0 / 0 / 0
Регистрация: 14.09.2013
Сообщений: 9
02.11.2013, 13:25     Нахождение корней уравнения #38
Можете прокомментировать метод Ньютона, пожалуйста.
Roy jones
1 / 1 / 0
Регистрация: 05.10.2013
Сообщений: 92
01.06.2014, 21:36     Нахождение корней уравнения #39
можете подсказать как сделать оценку погрешностей для хорд, касательных и половинного деления
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2014, 18:50     Нахождение корней уравнения
Еще ссылки по теме:

C++ нахождение корней квадратного уравнения
Нахождение корней уравнения C++
C++ Нахождение корней квадратного уравнения через дискриминант

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

Или воспользуйтесь поиском по форуму:
stinkerkiller
1 / 1 / 0
Регистрация: 29.09.2011
Сообщений: 17
01.07.2014, 18:50     Нахождение корней уравнения #40
Помогите пожалуйста с методом итераций, подставил f(x)= cos(x)-(-x+5) с погрешностью 0.002, правильно ли я всё сделал? Просто в языках разбираюсь ниже плинтуса. И если можно обьясните как оно работает
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
#include <conio.h>
#include <math.h>
#include <iostream>
#define pi 3.14
using namespace std;
double f(double x) {
 
    return   cos(x)-(-x+5);
}
 
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;
    x=2;//начальное приближение
    eps=0.002; //погрешность
    do {
        y=fi(x,L);
        b=fabs(x-y);
        x=y;
        n+=1;
    }
    while (b>=eps);
        cout<<"x="<<x<<"\n";
        cout<<"n="<<n<<"\n";
        getch();
    return 0;
}
Yandex
Объявления
01.07.2014, 18:50     Нахождение корней уравнения
Ответ Создать тему

Метки
метод дихотомии, метод золотого сечения, метод итераций, метод ньютона, метод половинного деления, метод фибоначчи, численные методы
Опции темы

Текущее время: 00:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru