171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
1

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

27.10.2012, 23:20. Показов 7219. Ответов 47
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго время суток. Написать программу для вычисления методом последовательных итераций уравнения x = A*cos(x). Параметр A вводится пользователем. Проверить, для каких значений параметра A применим метод последовательных итераций. Читал теорию про последовательные итерации, но к сожалению так и не понял как это можно применить для решения данной задачи???? Насколько я понял x = cos(x) при x очень близких к 0. Но остается параметр A, которой должен удовлетворять данному равенству. Ума не приложу как это реализовать программно???? Помогите пожалуйста!!!! Заранее огромное спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2012, 23:20
Ответы с готовыми решениями:

Уравнение cos(2/x) * sin(x) = 0 , вывести корни на экран
#include "stdafx.h" #include <iostream> #include <cmath> using namespace std; int main() {...

Решить уравнение вида x=A*cos(x) методом последовательных итераций
Всем привет! Пишу в DEV-C++, не думаю, что это важно. В целом задача на решение уравнения вида...

Вычислить s=cos(1+cos(2+....+cos(39+cos40)
Вычислить s=cos(1+cos(2+....+cos(39+cos40) помогите

Используя разложение cos(x) в ряд. Вычислить cos(0.5)
Знаю конечно, что наглость, но пожалуйста подскажите как это разложить? Так же в ряд Тейлора или...

47
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
28.10.2012, 00:04 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π
0
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
28.10.2012, 10:40  [ТС] 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();
}
//---------------------------------------------------------------------------
Но там задание помимо последовательных итераций использовать еще разложение в ряд. У меня в задании этого нет. Помогите пожалуйста как реализовать это программно???? Заранее огромное спасибо.
0
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
28.10.2012, 11:46 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;
}
}
1
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
28.10.2012, 14:38  [ТС] 5
doctor_lecter спасибо огромное, вопрос: метод последовательных итераций и метод простых итераций это одно и тоже????? Перечитал кучи литературы, но везде непонятно написано, только в одной статье в интернете слегка упоминается об этом. Заранее огромное спасибо.
0
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
28.10.2012, 14:44 6
Да, это один метод, его еще называют метод повторных подстановок.
1
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
28.10.2012, 16:05  [ТС] 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;
}
Но все равно программа работает не правильно, где ошибка????
0
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
28.10.2012, 16:22 8
Проблема в том, что при начальной точке 0.0 для этого уравнения метод расходится.
0
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
29.10.2012, 23:27  [ТС] 9
Подскажите кто-нибудь как можно изменить условие, чтобы при определенных значениях x выполнялось условие x = A * exp(-x). Экспонента непериодическая функция при x =0 равна 1 при x < 0 уходит на бесконечность при x > 0 стремится к 0. При каких значениях x выполняется неравенство x = A * exp(-x)???? Заранее огромное спасибо.

Добавлено через 15 часов 48 минут
Вычитал в интернете, что одним из корней данного уравнения при вычислении методом последовательных итераций может быть: https://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;
}
Мозг уже кипит????? Заранее огромное спасибо.
0
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
30.10.2012, 00:21 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 расходится. Это не означает то что код не правильный; данный метод плохо применим для уравнения такого типа.
1
Заблокирован
Автор FAQ
30.10.2012, 01:07 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 расходится.
- не проверял но тоже похоже на правду
1
171 / 104 / 25
Регистрация: 17.10.2010
Сообщений: 1,146
30.10.2012, 09:09  [ТС] 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;
}
???? Если не правильно, то поправьте меня пожалуйста. Заранее огромное спасибо.
0
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
30.10.2012, 10:56 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;
}
0
Заблокирован
Автор FAQ
30.10.2012, 11:42 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)  
1
Заблокирован
Автор FAQ
30.10.2012, 11:44 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;
}
1
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
30.10.2012, 11:52 16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот код для экспоненты, т.е практически никаких изменений, важно чтобы выполнялось условие |А| < 1
При A = -0.5 не будет решений.
0
Заблокирован
Автор FAQ
30.10.2012, 11:56 17
Цитата Сообщение от doctor_lecter Посмотреть сообщение
При A = -0.5 не будет решений.
- я бы сказал больше решений не будет при |А| > 0.5 т.е получается

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
|А| < 1
верно для косинуса, а для экспоненты это условие ещё жёще |A| < 0.5 (провел пару тестов с экспонентой и пришёл к такому выводу). Также думаю надо для экспоненты исключать точку ноль, т.к в этом случае решение тоже не определено. Надо бы по свободе посмотреть ОДЗ f(x) = x - A*exp(-x)
0
284 / 157 / 30
Регистрация: 22.09.2012
Сообщений: 283
30.10.2012, 12:06 18
При A > 0 решения есть всегда, данный метод начинает расходится при A > 3. Но при A < -0.4 (это примерное значение) решений уже нет.
С 0 все нормально, получается уравнение x=0
0
Заблокирован
Автор FAQ
30.10.2012, 13:07 19
doctor_lecter, лучше всего смотреть ОДЗ графически, на скрине анализ экспонеты в MathCAD, видно что изгиб поверхности f(x,A) идёт до А = 2, после только ноль, впринципе вручную можно подобрать реальный диапазон для А
Миниатюры
Уравнение x = A*cos(x)  
1
Заблокирован
Автор FAQ
30.10.2012, 13:13 20
Цитата Сообщение от doctor_lecter Посмотреть сообщение
при A < -0.4 (это примерное значение) решений уже нет.
- решения нет и при -0,4, лучше посмотри график поверхности и всё поймёшь.
Цитата Сообщение от doctor_lecter Посмотреть сообщение
данный метод начинает расходится при A > 3.
- кто расходится, метод простых итераций?А его критерии сходимости вообще когда-нибудь встречал?Т.е данный метод зависит от значения А? Хорошо а как быть скажем с таким уравнением x = cos(x) где тут А?
0
30.10.2012, 13:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2012, 13:13
Помогаю со студенческими работами здесь

pow(cos,cos)
Здравствуйте, помогите пожалуйста с квадратным корнем. Ошибка в pow(cos,cos). Вот...

|cos x - cos y| в степени
|cos x - cos y| в степени 1 + 2sin2y(1 + z + (z*z)/2 + (z*z*z)/3 + (z*z*z*z)/4) помогите найти...

Дано уравнение ax2+bx+c=0. Решить уравнение, результат вывести на экран.
Здравствуйте. Завтра зачет, нужно сдать две программы на с++, как их писать у меня весьма смутное...

Создать производные классы линейное уравнение и квадратное уравнение, в которых данная функция переопределена
Создать абстрактный базовый класс уравнение с виртуальной функцией - корни уравнения. Создать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru