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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
LEQADA
Мастер кустарных методов
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
#1

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

21.05.2012, 22:27. Просмотров 1327. Ответов 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
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++
Нужно решить уравнение sin(x)+log(x)=1 методом методом линейной интерполяции Помогите найти ошибку. Стока уже дней мучаюсь.. #...

Метод однократной интерполяции (ошибка в реализации) - C++
имеется схема алгоритма, метода однократной интерполяции. нужно реализовать ету схему используя с++. вот пишу код: #include...

Пересечение кубической параболы и окружности - C++
Задание звучит так: с клавиатуры вводятся коэффициенты, которые определяют полином третьего степени. Найти точки пересечения его с...

Найти минимум функции методом кубической параболы - C++
Добрый вечер. Делаю лабораторную работу по c++ (нахождение минимума функции методом кубической параболы) и не знаю как реализовать...

Создать титульный лист и построить график кубической параболы - C++
Создать титульный лист и построить график кубической параболы

Нахождение минимума функции одной переменной методом кубической параболы - C++
Допущена ошибка в коде.Предполагаю,что неверно выбран x1 в самой функции метода.Также возможна ошибка в выборе шага(я беру 0.59). ...

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя - C++
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

Погрешность интерполяции на C++ - C++
написал код для интерполяционного полинома Ньютоно, он работает правильно, но вот никак не могу разобратса как обчислить его погреность ...

Алгоритм линейной интерполяции - C++
Есть массив значений х с точками 0, 2, 4, 6, ... 30, 35, 40, 45.. и т.д., и соответствующие значения у в этих точках. Мне нужно найти...


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

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

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