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

Δ2 – процесс Эйткена и метод Вегстейна - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Mikle90
1 / 1 / 0
Регистрация: 15.03.2012
Сообщений: 23
19.05.2012, 19:53     Δ2 – процесс Эйткена и метод Вегстейна #1
Всем здравствуйте.Делаю программу на С++, очень давно очень не юзал. Делаю прогу по Δ2 – процесс Эйткена и метод Вегстейна,но конечные результаты совсем разные.Делаю по книге Вержбицкий,Численные методы Линейная алгебра 2002г. (с.189 и с.194)
Даны следующие алгоритмы:
Функцию φ(x ввел заранее
Δ2 – алгоритм Эйткена
Шаг 0. Ввод x0 (начального приближения), φ(x) (исходной функции), q (оценки модуля производной), ε (допустимой абсолютной погрешности).
Шаг 1. Вычисление значений x1 = φ(x0), x2 = φ(x1).
Шаг 2. Δ2 – ускорение: x ̃2:= (x0*x2 - x1^2)/(x2-2*x1+ x0 ).
Шаг 3. Вычисление контрольного значения: x3:= φ(x ̃2).
Шаг 4. Проверка на точность: если |x3- x ̃2 |> (1-q)/q ε, то положить x0=x ̃2, x1= x3, вычислить x2≔φ(x1) и вернуться к шагу 2.
Шаг 5. Положить ξ:≈x3 (с точностью до ε).

Алгоритм Вегстейна
Шаг 0. Ввести x0 (начальное приближение), φ(x) (исходную функцию), q (оценку модуля производной), ε (допустимую абсолютную погрешность).
Шаг 1. Вычислить x1=φ(x0); положить x ̃0=x0 , x ̃1=x1.
Шаг 2. Вычислить x2=φ(x ̃1 ).
Шаг 3.Проверить на точность: если |x2-x ̃1 |>(ε(1-q))/q, то вычислить x ̃2=(x2*x0-x1*x ̃1)/(x2+x ̃0-x1-x ̃1 ); переприсвоить значения x0=x1, x ̃0=x ̃1, x1=x2, x ̃1=x ̃2 и вернуться к шагу 2.
Шаг 4. Положить ξ:≈ x2 (с точностью ε)

x ̃ обозначает черточку вверху. 1) Прошу исправить вас ошибки 2)помочь вывести ξ с точностью ε
3) Избавиться от ошибки , когда q задаешь ноль но вычисления продолжаются(поэтому закоментировал процесс блокирующий ввод нуля). Заранее спасибо!!!!!!!!

при увелечении степени в функции ответы больше совпадают


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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
 
float q; // оценка модуля производной
float e; // допустимая абсолютная погрешность
float x0,x1,x2,x3,x00,x11,x22,xx0,xx1,xx2,xx00,xx11,xx22; // значения функции
using namespace std;
 
float fun(float x)
{
 float f;
 f=x*x+2;
 return f;
}
 
 
// задаем функцию Эйткена
float eitken(float q,float e,float x0,float x1,float x2,float x3,float x22)
 
{   // вычисление значение х1 и х2 
    x1=fun(x0);
    x2=fun(x1);
    // D^2 - ускорение x2
    x22=(x0*x2-x1*x1)/(x2-2*x1+x0);
    // вычисление х3
    x3=fun(x22);
    // проверка на точность
    if (abs(x3-x22)>(e-e*q)/q)
    
        { 
         x0=x22;
         x1=x3;
         x2=fun(x1);    
         return x0,x1;
        }
    else 
    {
     
     return x3;
    }
}
// задаем функцию Вегстейна
float vegstein(float q,float e,float xx0,float xx1,float xx2,float xx22,float xx00,float xx11)
{
    xx1=fun(x0);
    xx00=x0;
    xx11=xx1;
    xx2=fun(xx11);
    if(abs(xx2-xx11)>(e-e*q)/q)
    {
        xx22=(x2*x00-xx1*xx11)/(xx2+xx00-xx1-xx11);
        xx0=xx1;
        xx00=xx11;
        xx1=xx2;
        x11=x22;
        return xx0,xx00,xx1,xx11;
    }
    else
    {
        return xx2;
    }
}
 
 
float main()
{
    // Ввод значений 
    cout<<" Vvedite dannie dlya m.Eitkena i Vegsteina\n"<<" Vvedite nachalnoe priblizhenie X0\n";
    cin>>x0;
    cout<<" Vvedite dopustimuu absolutnuu progreshnost E\n";
    cin>>e;
    cout<<" Vvedite ocenky modyla proizvodnoi Q\n";
    cin>>q;
    //while (q==0)
    //{
    //  cout<<" Q ne dolzhno bit ravno 0 !! Vvedite drugoe!!\n";
//      cin>>q;
//  }
    
    // Вывод значения м.Эйткена
    float y;
    y=eitken(q,e,x0,x1,x2,x3,x22);
    cout<<" Znachenie m.Eitkena = "<<y<<"\n";
    // Вывод значения м.Вегстейна
    float z;
    z=vegstein(q,e,xx0,xx1,xx2,xx00,x11,xx22);
    cout<<" Znachenie m.Vegsteina = "<<z<<"\n";
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2012, 19:53     Δ2 – процесс Эйткена и метод Вегстейна
Посмотрите здесь:

Есть процесс A и дочерний процесс B, который находит хэндл родительского процесса A. И этот хэндл в разных случаях РАЗНЫЙ! Почему? C++
Объясните метод Эйткена C++
Метод деления отрезка пополам для решения нелинейных уравнений (метод дихотомии) C++
C++ Метод медиан из трех элементов VS улучшенный быстрый метод сортировки(метод Бентли-Макилроя)
метод Эйткена-Стеффенсона C++
C++ Производный класс: метод возведения в произвольную степень, и метод для вычисления логарифма числа
C++ Процесс А инициализирует массив случайными значениями и записывает их в файл, а затем запускает процесс Б
Нахождения корней уравнения: метод половинного деления (бисекции) или метод хорд C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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