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

Метод кубической интерполяции - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
21.05.2012, 22:27     Метод кубической интерполяции #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
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <cmath>
using namespace std;
void Coeff_11(double a, double b, double *f_x, double *c, double *d);
void kub (double a, double b, double *f_x, double *c, double *d, double *z);
double F(double x);
double F_D(double x);
 
int main () {
    double a=0,b=5;// Начало и конец отрезка
    double f_x[2], c[2], d[2], z[2];  // f_x - значение функции на границах отрезка; c - коэффициенты; d - значение производной на концах отрезка; z - экстремумы построенного многочлена
    kub (a,b,f_x,c,d,z); 
}
 
void kub (double a, double b, double *f_x, double *c, double *d, double *z){
    double min;
    f_x[0] = F(a); f_x[1] = F(b); // Заполняю массивы
    d[0] = F_D(a); d[1] = F_D(b);
    if (F_D(a)<=0 && F_D(b)>=0){ // Проверяю условие применимости метода
        Coeff_11(a,b,f_x,c,d); // Вызываю функцию вычисления 
        z[0] = (-c[2] + sqrt (c[2]*c[2] - 3*c[3]*c[1]))/(3*c[3]); // Вычисляю нули производной 
        z[1] = (-c[2] - sqrt (c[2]*c[2] - 3*c[3]*c[1]))/(3*c[3]);
        if (z[0]>=a && z[0]<=b) min = z[0]; // Если нуль входит в наш отрезок, то он является минимумом
        else min = z[1];
        if (fabs(F_D(min))<0.001) {cout<<(a + b)/2<<endl; return;} //Если значение производной исходной функции в точке найденного минимума достаточно мало, то мы нашли отрезок, в котором находится минимум исходной функции
        if (F_D(min)>0) {kub (a,min,f_x,c,d,z);} // Если значение производной исходной функции в точке найденного минимума больше нуля, то отрезком локализации минимума является отрезок (a,min)
        if (F_D(min)<0) {kub (min,b,f_x,c,d,z);} // Если значение производной исходной функции в точке найденного минимума меньше нуля, то отрезком локализации минимума является отрезок (min,b)
    }
    else cout<<"ERROR"; //Если условие применимости метода не выполняется, то вывести на экран ERROR
}
 
void Coeff_11(double a, double b, double *f_x, double *c, double *d)
{
    double tmp1, tmp2;
    //Тут считаются коэффициенты
    c[0] = f_x[0];
    c[1] = d[0];
    tmp2 = b - a;
    tmp1 = (f_x[1] - f_x[0]) / tmp2;
    c[2] = (3 * tmp1 - 2 * d[0] - d[1]) / tmp2;
    tmp2 *= tmp2;
    c[3] = (d[0] + d[1] - 2 * tmp1) / tmp2;
}
 
double F(double x) {return 3*x*x*x*x*x*x + (x-3)*(x-3);} // Функция
double F_D(double x){return 2 * (9*x*x*x*x*x + x - 3);} //Производная функции
Миниатюры
Метод кубической интерполяции  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 22:27     Метод кубической интерполяции
Посмотрите здесь:

метод линейной интерполяции C++
Метод однократной интерполяции (ошибка в реализации) C++
C++ Создать титульный лист и построить график кубической параболы
Как задать криволинейный замкнутый контур по точкам методом кубической интерполяции? C++
C++ Нахождение минимума функции одной переменной методом кубической параболы
Найти минимум функции методом кубической параболы C++
C++ СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя
Пересечение кубической параболы и окружности C++

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

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

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