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

Метод простых итераций для одного уравнения - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.88
8lgm
0 / 0 / 0
Регистрация: 21.09.2013
Сообщений: 16
29.09.2013, 21:59     Метод простых итераций для одного уравнения #1
arccos(x) - sqrt(1-0.3x^3) = 0
Отрезок от [0;1]
+приближенное значение корня 0.5629
Для метода итераций получается, что
fi(x)=sqrt(1-0.3x^3)
т.к. x в границах от -1 до 1, верно?

Дальше нам нужно реализовать цикл на с++, который бы перебирал значения до верного корня с нулем? А вот тут-то я и сел, ибо как такое реализовать слабо представляю. Т.е. в цикле берем начальное значение, допустим 0 и прибавляем в каждом шаге по 0.05, и подставляя в уравнение каждый корень?

Стандартных библиотек будет достаточно?
#include <iostream>
#include <conio.h>
#include <math.h>

Дальше задать fi(x)?

Написать цикл для подсчета значений?

Сделать вывод переменной?

Через какой оператор это реализуемо (if )?

Заранее спасибо
И да, не спрашивайте, я пока что полный ноль в с++.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
8lgm
0 / 0 / 0
Регистрация: 21.09.2013
Сообщений: 16
06.10.2013, 01:47  [ТС]     Метод простых итераций для одного уравнения #2
Вообщем я понял, в чем суть метода. Надо задать x0 и x1. Преобразуем для начала arccos(x) - sqrt(1-0.3x^3) = 0
в arccos(x) = sqrt(1-0.3x^3)
Где, арккосинус можно заменить на x1, а под корнем на x0.
Т.е. x1 = sqrt(1-0.3x0^3) = 0. Мы должны посчитать значение на отрезке [0;1], т.е. задаем начальный х0 и считаем х1 через уравнение. Дальше задаем эпсилон (e) = 0.001, с ним и надо сравнивать значений для цикла т.е. по этому|x0-x1|< e
Если не подходит корень, то задаем х0 полученное значение х1 и считаем новый х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
#include <iostream>
#include <conio.h>
#include <math.h>
 
using namespace std;
 
int main()
{
    setlocale(0, "");
    int i = 0;
    double e = 0.001;
    double x0;
    double x1;
    cout<<"Введите значение x0 с промежутка [0;1] =" <<endl;
    cin>> x0;
    x1 = sqrt(1-0.3*pow(x0 , 3));
    while ( abs(x0-x1) < e)
    {
        x1 = sqrt(1-0.3*pow(x0 , 3));
        i += 1;
        x1 = x0;
    }
    cout << "Значение корня = " << x1 << endl; 
    cout << "Число итераций = " << i <<endl;
 
    return 0;
}
Проблема в том, что цикл не хочет выполняться, а просто выдает значение х1 с подсчетом, ну и кол-во итераций тоже не выводится. Ч.Я.Д.Н.Т.?
Заранее спасибо
8lgm
0 / 0 / 0
Регистрация: 21.09.2013
Сообщений: 16
09.10.2013, 20:15  [ТС]     Метод простых итераций для одного уравнения #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
#include <iostream>
#include <conio.h>
#include <math.h>
 
using namespace std;
void main ()
{
    double y;
    double x;
    float e;
    int i=0;
    cout <<"\n Input x (From 0 to 1) \n x=";
        cin >>x;
    cout <<"\n Input e (0.001 or less) \n e=";
        cin >>e;
 
        y = ((pow((1-acos(pow(x,2))),1.0/3.0))/0.3);
 
        while (abs((y-x)>e))
        {
        x=y;
        y=((pow((1-acos(pow(x,2))),1.0/3.0))/0.3);
        i=i+1;
        }
 
 
 
    cout <<"\n i = "<<i;
    cout <<"\n y = "<<y;
    getch ();
}
7 задание отсюда
https://www.dropbox.com/s/rjxzs8kvrs...001_170223.jpg
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
09.10.2013, 21:53     Метод простых итераций для одного уравнения #4
во-первых, вы вываливаетесь на возведении в нецелую степень отрицательного значения,
во-вторых, fabs.
в третьих, разберитесь с записью выражений на С++.
8lgm
0 / 0 / 0
Регистрация: 21.09.2013
Сообщений: 16
10.10.2013, 00:11  [ТС]     Метод простых итераций для одного уравнения #5
Цитата Сообщение от vua72 Посмотреть сообщение
во-первых, вы вываливаетесь на возведении в нецелую степень отрицательного значения,
во-вторых, fabs.
в третьих, разберитесь с записью выражений на С++.
Окей, кое что разрешилось т.к. я преобразовал уравнение по-другому, например стало выводиться и считаться значение y. Но все равно цикл не запускается...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    double y = ((1-(acos (x)*(acos (x))/(0.3*x*x));
 
    while (fabs(x-y)>=e)
    {
        double y = ((1-(acos (x)*(acos (x))/(0.3*x*x));
        i++;
        x=y;
    }
 
    cout <<"\n i = "<<i;
    cout <<"\n y = "<<y;
    getch ();
}
Yandex
Объявления
10.10.2013, 00:11     Метод простых итераций для одного уравнения
Ответ Создать тему
Опции темы

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