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

Решение уравнения - C++

Восстановить пароль Регистрация
 
rebel91
0 / 0 / 0
Регистрация: 22.09.2009
Сообщений: 89
27.03.2012, 01:14     Решение уравнения #1
Помогите пожалуйста с кодом для решения вот такого уравнения. В голову ничего не лезет(
Миниатюры
Решение уравнения  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2012, 01:14     Решение уравнения
Посмотрите здесь:

C++ Решение квадратного уравнения
C++ Решение уравнения
решение уравнения C++
Решение уравнения C++
Решение уравнения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 492
27.03.2012, 12:14     Решение уравнения #2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main()
{
       float x,e,f,a,b;
while(!fflush(stdin)&&printf("Vvedite chislo x: ")&&!scanf("%f",&x));
while(!fflush(stdin)&&printf("Vvedite chislo e: ")&&!scanf("%f",&e));
       a=x*x;    
       b=pow(e,a);
       f=x*b;
       printf("Rezultat %0.2f ",f);
       getch();
       return 0;
}
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
27.03.2012, 12:36     Решение уравнения #3
Решение делением отрезка пополам
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
#include <stdio.h>
#include <conio.h>
//  описание функции y=f(x)
double f(double x)
{
      return x*exp(x*x)-1.;
}
// функция sign проверяет равенство знаков
int sign(double a,double b)
{
        if(a>0 && b>0)
return 1;
        if (a<=0 && b<=0)
            return 1;
        return 0;
}
// вычисление корня делением отрезка пополам.
double root(double xleft,double xright,double eps)
{
        double x0,y0,yleft,yright;
        yleft=f(xleft);
        yright=f(xright);
        if( xleft > xright )// Левая граница > правой
        {
            x0=xleft;
            xleft=xright;
            xright=xleft;
        }
        if ( sign(yleft,yright) )// Одинаковый знак.
        {
            printf(“Eroor! Equal signs!);
            return 0;
        }
        while (xright-xleft>eps)
        {
            x0=(xright+xleft)/2;
            y0=f(x0);
            if (sign(yleft,y0))
            {
                yleft=y0;
                xleft=x0;
            }
            else
            {
                yright=y0;
                xright=x0;
            }
        }
        return x0;
}
int main()
{
     double x1=0,x2=1.,eps=1e-6;
     double r=root(x1,x2,eps);
     printf("root=%lf",r);
     getch();
}
Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от a.n.o.n.i.m Посмотреть сообщение
printf("Vvedite chislo e: ")
Оказывается, числа e разные бывают!!!!

rebel91
0 / 0 / 0
Регистрация: 22.09.2009
Сообщений: 89
27.03.2012, 14:29  [ТС]     Решение уравнения #4
Не по теме:
Сообщение от a.n.o.n.i.m
printf("Vvedite chislo e: ")
Оказывается, числа e разные бывают!!!!
Да, меня это тоже смутило) Спасибо большое!
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 492
27.03.2012, 14:35     Решение уравнения #5
да я даже внимания не обратил,оно вроде 2,7 год чей то повторяется два раза
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2012, 15:45     Решение уравнения #6
e - это показатель экспоненты и равен он 2,718
данное уравнение проще всего решать методом простых итераций
http://www.cyberforum.ru/cgi-bin/latex.cgi?x = 1 - {e}^{-{x}^{2}}
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2012, 16:02     Решение уравнения #7
Вот и вся задача
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
#include <iostream>
#include <cmath>
using namespace std;
 
double f(double x)
{
    return 1 - x*exp(x*x);
}
 
double g(double x)
{
    return 1 - exp(-x*x);
}
 
int main()
{
    double x;
    long iter = 0;
    cout<<"Enter initial value of x : ";
    if(!(cin>>x))
        cout<<"Input error\n";
    else
    while(0.00001 < fabs(x - g(x)))
    {
        system("cls");
        cout<<"Iteration : "<<(iter++)<<" x = "<<x<<endl;
        x = g(x);
    }
    system("pause");
    return 0;
}
Миниатюры
Решение уравнения  
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2012, 16:07     Решение уравнения #8
Если кому интересно вот алгоритм позволяющий вводить погрешность вычислений(в предыдущем варианте я ограничил её значением 0,00001)
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
0.00001 < fabs(x - g(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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <cmath>
using namespace std;
 
double f(double x)
{
    return 1 - x*exp(x*x);
}
 
double g(double x)
{
    return 1 - exp(-x*x);
}
 
template <class T>
bool getInput(const char *msg, T &val)
{
    bool bRet = true;
    cout<<msg;
    if(!(cin>>val))
        bRet = false;
    return bRet;
}
 
int main()
{
    double x, eps;
    long iter = 0;
    if(!getInput("Enter initial value of x   : ", x))
        cout<<"Input error\n";
    else
    if(!getInput("Enter error of calculation : ", eps))
        cout<<"Input error\n";
    else
    while(eps < fabs(x - g(x)))
    {
        cout<<"Iteration : "<<(iter++)<<" x = "<<x<<endl;
        x = g(x);
    }
    system("cls");
    cout<<"Calculations stoped on : "<<iter<<" iteration\n";
    cout<<"Value of x                     : "<<x<<endl;
    cout<<"Value of f(x) = 1 - x*exp(x*x) : "<<f(x)<<endl;
    cout<<"Error of calculations : "<<fabs(x - g(x))<<endl;
    system("pause");
    return 0;
}
Миниатюры
Решение уравнения  
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2012, 16:15     Решение уравнения #9
zss, функция f(x) не та
Цитата Сообщение от zss Посмотреть сообщение
return x*exp(x*x)-1.;
x*exp(x*x) = 1 => f(x) = 1 - x*exp(x*x)
не вопрос итерации окончатся одинаково но вот график функции будет другим
Миниатюры
Решение уравнения  
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
27.03.2012, 19:15     Решение уравнения #10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
данное уравнение проще всего решать методом простых итераций
Однако, Вы решили не то уравнение, которое требовалось.
Надо xex*x=1,
т.е. x=e-x*x
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 492
27.03.2012, 19:50     Решение уравнения #11
Цитата Сообщение от zss Посмотреть сообщение
Однако, Вы решили не то уравнение, которое требовалось.
Надо xex*x=1,
т.е. x=e-x*x

Как это ты так перенес умножение?
так нельзя
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2012, 20:53     Решение уравнения #12
zss, да теперь увидел, что дал маху с g(x).
rebel91, прототип данной функции
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
double g(double x)
{
* * * * return 1 - exp(-x*x);
}
должен выглядеть таким образом
C++
1
2
3
4
double g(double x)
{
    return exp(-x*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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <cmath>
using namespace std;
 
double f(double x)
{
    return 1 - x*exp(x*x);
}
 
double g(double x)
{
    return exp(-x*x);
}
 
template <class T>
bool getInput(const char *msg, T &val)
{
    bool bRet = true;
    cout<<msg;
    if(!(cin>>val))
        bRet = false;
    return bRet;
}
 
int main()
{
    double x, eps;
    long iter = 0;
    if(!getInput("Enter initial value of x   : ", x))
        cout<<"Input error\n";
    else
    if(!getInput("Enter error of calculation : ", eps))
        cout<<"Input error\n";
    else
    while(eps < fabs(x - g(x)))
    {
        cout<<"Iteration : "<<(iter++)<<" x = "<<x<<endl;
        x = g(x);
    }
    system("cls");
    cout<<"Calculations stoped on : "<<iter<<" iteration\n";
    cout<<"Value of x                     : "<<x<<endl;
    cout<<"Value of f(x) = 1 - x*exp(x*x) : "<<f(x)<<endl;
    cout<<"Error of calculations : "<<fabs(x - g(x))<<endl;
    system("pause");
    return 0;
}
Миниатюры
Решение уравнения  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2012, 20:56     Решение уравнения
Еще ссылки по теме:

Решение уравнения C++
C++ Решение квадратного уравнения
C++ Решение уравнения

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2012, 20:56     Решение уравнения #13
a.n.o.n.i.m, zss здесь
Цитата Сообщение от zss Посмотреть сообщение
Надо xex*x=1,
т.е. x=e-x*x
всё сделал правильно.
Объясняю почему : кроме метода хорд, метода бисекций существует метод простых итераций.
Сущность данного метода состоит в том чтобы выразить независимую переменную через саму себя.
Поясняю: к примеру есть уравнение x - sin(x) = 0 так вот f(x) = x - sin(x) а g(x) является тем самым выражением х через самого себя g(x) = sin(x) [т.е. x = sin(x)]. Далее всё запихивают в итерационный процес и крутят до тех пор пока разница между х и g(x) не будет менее задаваемой точность. Вот по такому алгоритму было х и было найдено.


rebel91, пожалуйста если взял в работу мой код поправь его на последний, я кое что перекрутил когда выражал х через самого себя, поэтому считается отличное от твоего уравнение. Приношу свои извинения
Yandex
Объявления
27.03.2012, 20:56     Решение уравнения
Ответ Создать тему
Опции темы

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