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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 656
#1

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

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

Всем доброго время суток. Написать программу для вычисления методом последовательных итераций уравнения x = A*cos(x). Параметр A вводится пользователем. Проверить, для каких значений параметра A применим метод последовательных итераций. Читал теорию про последовательные итерации, но к сожалению так и не понял как это можно применить для решения данной задачи???? Насколько я понял x = cos(x) при x очень близких к 0. Но остается параметр A, которой должен удовлетворять данному равенству. Ума не приложу как это реализовать программно???? Помогите пожалуйста!!!! Заранее огромное спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2012, 23:20     Уравнение x = A*cos(x)
Посмотрите здесь:

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

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

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

|cos x - cos y| в степени - C++
|cos x - cos y| в степени 1 + 2sin2y(1 + z + (z*z)/2 + (z*z*z)/3 + (z*z*z*z)/4) помогите найти ответ, и ошибку какую я допустил, я хз...

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

Вычисление cos - C++
Надо вычислить cos от 0 до 360 Но for(double j=0;j<=360;j++) cout << j << " "<< cos(j) << "\n"; или for(double...

y=sin(n*x)+cos(k*x)+ln(m*x) - C++
y=sin(n*x)+cos(k*x)+ln(m*x) где x= { e^z+z, при z>1 z^2+1, при z меньше или равно 1 не поможете ли мне пожалуйста...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
doctor_lecter
280 / 153 / 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
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 656
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
280 / 153 / 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
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 656
28.10.2012, 14:38  [ТС]     Уравнение x = A*cos(x) #5
doctor_lecter спасибо огромное, вопрос: метод последовательных итераций и метод простых итераций это одно и тоже????? Перечитал кучи литературы, но везде непонятно написано, только в одной статье в интернете слегка упоминается об этом. Заранее огромное спасибо.
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
28.10.2012, 14:44     Уравнение x = A*cos(x) #6
Да, это один метод, его еще называют метод повторных подстановок.
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 656
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
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
28.10.2012, 16:22     Уравнение x = A*cos(x) #8
Проблема в том, что при начальной точке 0.0 для этого уравнения метод расходится.
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 656
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
280 / 153 / 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
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 656
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
280 / 153 / 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
280 / 153 / 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
280 / 153 / 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)
Еще ссылки по теме:

Из Sin в Cos С++ - C++
Здраствуйте, мне нужно написать програму которая за рядами Тейлора выводит косинус . Проблема заключаеться в том ,что если програма...

функция cos - C++
доброго времени суток столкнулся с проблемкой при работе с функцией cos и sin,дело в то что функция непонятно почему выдаёт непредсказуемые...

Sin() cos() - C++
Всем приветик. У меня последний Qt MinGW. Вопрос: Перед использованием функции sin(x), мне сказали что нужно градусы перевести в...

Определить sin и cos - C++
Считая, что функции sin и cos применимы только к аргументам в диапазоне , вычислить y = sin(x) для любого заданного вещественного числа x.

Ограничения для Cos - 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)
Ответ Создать тему
Опции темы

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