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

Уравнение x = A*cos(x) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
27.10.2012, 23:20     Уравнение x = A*cos(x) #1
Всем доброго время суток. Написать программу для вычисления методом последовательных итераций уравнения x = A*cos(x). Параметр A вводится пользователем. Проверить, для каких значений параметра A применим метод последовательных итераций. Читал теорию про последовательные итерации, но к сожалению так и не понял как это можно применить для решения данной задачи???? Насколько я понял x = cos(x) при x очень близких к 0. Но остается параметр A, которой должен удовлетворять данному равенству. Ума не приложу как это реализовать программно???? Помогите пожалуйста!!!! Заранее огромное спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
28.10.2012, 00:04     Уравнение x = A*cos(x) #2
При x близких к 0 cos(x) будет около 1. x = cos(x) при x близком к 0,73.
1 корень точно будет для х от -π до π при любом A. Проблема в том что чем больше A, тем больше будет корней.
Для начала можно попробовать искать корень при x0 = 0 и небольших значениях A. Тогда будет последовательность 0, A, Acos(A), Acos(Acos(A)), ...
При больших значениях A можно найти 1 корень если взять x0 немного меньше чем sign(A)π, например sign(A)*0.75π
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
28.10.2012, 10:40  [ТС]     Уравнение x = A*cos(x) #3
А как это реализовать программно ума не приложу?. Весь мозг себе сломал. Перерыл весь интернет, но так ничего подобного нашел на C++. Вот что нашел для y=chx.
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
//---------------------------------------------------------------------------
#include <iostream.h>
#include <math.h>
#include <stdio.h>
//---------------------------------------------------------------------------
void main()
{      double y,x,a,eps,alpha; int k,n;
 
cout << "Set x=";    cin>>x;       getchar();
y=(exp(x)+exp(-x))/2;    //chx
//вывод точного результата
cout <<"\n\t\tFor function y=chx   at x="<< x << " exact value y="<<y <<"\n\n";
 
cout << "Set value eps (End - 0).   eps=";    cin>>eps;       getchar();
//cycle
while(eps!=0)
{  cout << "\nAt  eps=" <<eps<<endl;
   for (a=x*x/2,y=1,n=1,k=1;
        fabs(a)>=eps&&n<1000;
        n++,k++,y+=a,alpha=(x*x)/(2*k *(2*k-1)),a*=alpha)
{      //вывод результатов
        cout << "The approached value y="<< y
        << "\t\tIt is summarized " << n << " members of line"<<endl;
};
cout << "\nSet value eps (End - 0).   eps=";    cin>>eps;       getchar();
}
cout << "\nProgram over! Press Enter.\n";
getchar();
}
//---------------------------------------------------------------------------
Но там задание помимо последовательных итераций использовать еще разложение в ряд. У меня в задании этого нет. Помогите пожалуйста как реализовать это программно???? Заранее огромное спасибо.
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
28.10.2012, 11:46     Уравнение x = A*cos(x) #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cmath>
#include <iostream>
 
using namespace std;
 
int main() {
    const double pi = acos(-1.0);
    double x=0.0, x0, A, eps;
    cout << "A = ";
    cin >> A;
    cout << "eps = ";
    cin >> eps;
    do {
        x0 = x;
        x = A*cos(x0);
    } while (abs(x-x0) > eps);
    cout << "x = " << x << endl;
    system("pause");
    return 0;
}
}
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
28.10.2012, 14:38  [ТС]     Уравнение x = A*cos(x) #5
doctor_lecter спасибо огромное, вопрос: метод последовательных итераций и метод простых итераций это одно и тоже????? Перечитал кучи литературы, но везде непонятно написано, только в одной статье в интернете слегка упоминается об этом. Заранее огромное спасибо.
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
28.10.2012, 14:44     Уравнение x = A*cos(x) #6
Да, это один метод, его еще называют метод повторных подстановок.
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
28.10.2012, 16:05  [ТС]     Уравнение x = A*cos(x) #7
Не охота создавать новую тему сделать тоже самое, но только для x = A * exp(-x). Немножко переделал ваш код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cmath>
#include <iostream>
 
using namespace std;
 
int main() {
    const double pi = acos(-1.0);
    double x=0.0, x0, A, eps;
    cout << "A = ";
    cin >> A;
    cout << "eps = ";
    cin >> eps;
    do {
        x0 = x;
        x = A*exp(-x0);
    } while (abs(x-x0) > eps);
    cout << "x = " << x << endl;
    system("pause");
    return 0;
}
Но все равно программа работает не правильно, где ошибка????
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
28.10.2012, 16:22     Уравнение x = A*cos(x) #8
Проблема в том, что при начальной точке 0.0 для этого уравнения метод расходится.
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
29.10.2012, 23:27  [ТС]     Уравнение x = A*cos(x) #9
Подскажите кто-нибудь как можно изменить условие, чтобы при определенных значениях x выполнялось условие x = A * exp(-x). Экспонента непериодическая функция при x =0 равна 1 при x < 0 уходит на бесконечность при x > 0 стремится к 0. При каких значениях x выполняется неравенство x = A * exp(-x)???? Заранее огромное спасибо.

Добавлено через 15 часов 48 минут
Вычитал в интернете, что одним из корней данного уравнения при вычислении методом последовательных итераций может быть: http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{(0)}=0.5*(1 + \exp(-1));. Подставил его, но программа все равно не считает???? Подскажите пожалуйста в чем ошибка???? Заранее огромное спасибо.

Добавлено через 8 часов 54 минуты
Подскажите пожалуйста этот код правильный????
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cmath>
#include <iostream>
using namespace std;
int main() {
   double x = 0.47, x0, A, eps = 0.00001;
    cout << "A = ";
    cin >> A;
    do {
        x0 = x;
       x  =  A * exp(-x0);
 
    } while ((x-x0) < 1.0);
    cout << "x = " << x << endl;
    system("pause");
    return 0;
}
Мозг уже кипит????? Заранее огромное спасибо.
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
30.10.2012, 00:21     Уравнение x = A*cos(x) #10
Цитата Сообщение от isaak Посмотреть сообщение
while ((x-x0) < 1.0);
Тут ошибка. Должно быть while(abs(x-x0) > eps);
Смысл этого заключается в том, что теоретически в данном методе корень x найден, когда на следующей итерации этого метода получается то же значение x, но на практике из-за неточности вычислений такое невозможно, поэтому задается точность ε, такую что если выполняется условие |a-b| < ε, считается что a=b.
Для уравнения x = A * exp(-x) начальное значение x0 = 0.5(1+exp(-1)) позволяет найти решение при небольших A (проверял при eps = 0.001, A=1, A=2, при 3 начинает расходится), при больших A расходится. Это не означает то что код не правильный; данный метод плохо применим для уравнения такого типа.
-=ЮрА=-
Заблокирован
Автор FAQ
30.10.2012, 01:07     Уравнение x = A*cos(x) #11
isaak, я поддерживаю мысли doctor_lecter, причём самая основная ошибка
Цитата Сообщение от isaak Посмотреть сообщение
while ((x-x0) < 1.0);
вот эта.
Цитата Сообщение от doctor_lecter Посмотреть сообщение
while(abs(x-x0) > eps);
- я бы поставли fabs double же(хоте в 10-й версии студии abs по моему перегружен уже и для вещественных, но всё же лучше ставить fabs, дабы код был портируем даже в более низкие версии студии)
Цитата Сообщение от doctor_lecter Посмотреть сообщение
A=1, A=2, при 3 начинает расходится), при больших A расходится.
- не проверял но тоже похоже на правду
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
30.10.2012, 09:09  [ТС]     Уравнение x = A*cos(x) #12
-=ЮрА=-, doctor_lecter насколько я понял из ваших рассуждений наиболее правильный код выглядит следующим образом:
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
#include <cmath>
#include <iostream>
 
using namespace std;
 
int main() {
     double x=0.0, x0, A, eps;
    cout << "eps = ";
    cin >> eps;
    cout << "A = ";
    cin >> A;
    if (fabs (A) >= 3)
    {
    cout << "No solutions " << endl;
}
    else
    {
    do {
        x0 = x;
        x = A*exp(-x0);
    } while (fabs(x-x0) > eps);
    cout << "x = " << x << endl;
}
    system("pause");
    return 0;
}
???? Если не правильно, то поправьте меня пожалуйста. Заранее огромное спасибо.

Добавлено через 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
#include <cmath>
#include <iostream>
 
using namespace std;
 
int main() {
     double x=0.0, x0, A, eps;
    cout << "eps = ";
    cin >> eps;
    cout << "A = ";
    cin >> A;
    if  (A >= 3) 
    {
    cout << "No solutions " << endl;
}
    else
    {
    do {
        x0 = x;
        x = A*exp(-x0);
    } while (fabs(x-x0) > eps);
    cout << "x = " << x << endl;
}
    system("pause");
    return 0;
}
???? Если не правильно, то поправьте меня пожалуйста. Заранее огромное спасибо.
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
30.10.2012, 10:56     Уравнение x = A*cos(x) #13
Еще при A<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
#include <cmath>
#include <iostream>
#include <limits>
 
using namespace std;
 
int main() {
    setlocale(LC_ALL, "Rus");
    double inf = numeric_limits<double>::infinity();
    double x=0.0, x0, A, eps;
    int k=0, maxIterations = 10000;
    cout << "A = ";
    cin >> A;
    cout << "eps = ";
    cin >> eps;
    do {
        ++k;
        x0 = x;
        x = A*exp(-x0);
    } while ((fabs(x-x0) > eps) && (k < maxIterations));
    if (k == maxIterations)
        cout << "Метод расходится" << endl;
    else
        if (fabs(x) == inf)
            cout << "Нет решений" << endl;
        else
            cout << "x = " << x << endl;
    system("pause");
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
30.10.2012, 11:42     Уравнение x = A*cos(x) #14
isaak, вобщем сегодня посмотрел я на твою проблемму, первое где ты вообще увидел что уравнение x = A*cos(x) эквивалентно x = A*exp(-x) т.е этого момента я совсем не понял. Теперь дальше, уравнение x = A*cos(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
#include <cmath>
#include <iostream>
using namespace std;
 
double A;
double g(double x)
{
    return A*cos(x);
}
 
double f(double x)
{
    return x - g(x);
}
 
int main()
{
    double x;
    double eps;
    cout<<"Enter initial value of A : ";cin>>A;
    cout<<"Enter initial value of x : ";cin>>x;
    cout<<"Enter calculetions error : ";cin>>eps;
    while(eps < fabs(f(x)))
    {
        system("cls");
        cout<<"x   = "<<(x = g(x))<<endl;
        cout<<"err = "<<f(x)<<endl;
    }
    cout<<"\tResults"<<endl;
    cout<<"x        = "<<x<<endl;
    cout<<"A*cos(x) = "<<g(x)<<endl;
    system("pause");
    return 0;
}
Важно чтобы А по модулю было меньше 1-цы
Для экспоненты A*exp(-x); просто поменяй формулу в double g(double x)
Миниатюры
Уравнение x = A*cos(x)  
-=ЮрА=-
Заблокирован
Автор FAQ
30.10.2012, 11:44     Уравнение x = A*cos(x) #15
Вот код для экспоненты, т.е практически никаких изменений, важно чтобы выполнялось условие |А| < 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
33
34
35
#include <cmath>
#include <iostream>
using namespace std;
 
double A;
double g(double x)
{
    return /*A*cos(x)*/A*exp(-x);
}
 
double f(double x)
{
    return x - g(x);
}
 
int main()
{
    double x;
    double eps;
    cout<<"Enter initial value of A : ";cin>>A;
    cout<<"Enter initial value of x : ";cin>>x;
    cout<<"Enter calculetions error : ";cin>>eps;
    while(eps < fabs(f(x)))
    {
        system("cls");
        cout<<"x   = "<<(x = g(x))<<endl;
        cout<<"err = "<<f(x)<<endl;
    }
    cout<<"\tResults"<<endl;
    cout<<"x        = "<<x<<endl;
    //cout<<"A*cos(x) = "<<g(x)<<endl;
    cout<<"A*exp(-x) = "<<g(x)<<endl;
    system("pause");
    return 0;
}
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
30.10.2012, 11:52     Уравнение x = A*cos(x) #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот код для экспоненты, т.е практически никаких изменений, важно чтобы выполнялось условие |А| < 1
При A = -0.5 не будет решений.
-=ЮрА=-
Заблокирован
Автор FAQ
30.10.2012, 11:56     Уравнение x = A*cos(x) #17
Цитата Сообщение от doctor_lecter Посмотреть сообщение
При A = -0.5 не будет решений.
- я бы сказал больше решений не будет при |А| > 0.5 т.е получается

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
|А| < 1
верно для косинуса, а для экспоненты это условие ещё жёще |A| < 0.5 (провел пару тестов с экспонентой и пришёл к такому выводу). Также думаю надо для экспоненты исключать точку ноль, т.к в этом случае решение тоже не определено. Надо бы по свободе посмотреть ОДЗ f(x) = x - A*exp(-x)
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
30.10.2012, 12:06     Уравнение x = A*cos(x) #18
При A > 0 решения есть всегда, данный метод начинает расходится при A > 3. Но при A < -0.4 (это примерное значение) решений уже нет.
С 0 все нормально, получается уравнение x=0
-=ЮрА=-
Заблокирован
Автор FAQ
30.10.2012, 13:07     Уравнение x = A*cos(x) #19
doctor_lecter, лучше всего смотреть ОДЗ графически, на скрине анализ экспонеты в MathCAD, видно что изгиб поверхности f(x,A) идёт до А = 2, после только ноль, впринципе вручную можно подобрать реальный диапазон для А
Миниатюры
Уравнение x = A*cos(x)  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2012, 13:13     Уравнение x = A*cos(x)
Еще ссылки по теме:

C++ Написать программу, которая решает уравнение с одним неизвестным и выводит в консоль значение неизвестного. Уравнение посимвольно вводится с клавиатур
Создать производные классы линейное уравнение и квадратное уравнение, в которых данная функция переопределена C++
Уравнение cos(2/x) * sin(x) = 0 , вывести корни на экран C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
30.10.2012, 13:13     Уравнение x = A*cos(x) #20
Цитата Сообщение от doctor_lecter Посмотреть сообщение
при A < -0.4 (это примерное значение) решений уже нет.
- решения нет и при -0,4, лучше посмотри график поверхности и всё поймёшь.
Цитата Сообщение от doctor_lecter Посмотреть сообщение
данный метод начинает расходится при A > 3.
- кто расходится, метод простых итераций?А его критерии сходимости вообще когда-нибудь встречал?Т.е данный метод зависит от значения А? Хорошо а как быть скажем с таким уравнением x = cos(x) где тут А?
Yandex
Объявления
30.10.2012, 13:13     Уравнение x = A*cos(x)
Ответ Создать тему
Опции темы

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