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

задачка по вычислению интерполянта - C++

Восстановить пароль Регистрация
 
anton-mix
0 / 0 / 0
Регистрация: 02.11.2011
Сообщений: 68
02.11.2011, 17:57     задачка по вычислению интерполянта #1
вообщем есть задачка
1.Найти значения функции F(x) в указанных точках x(j) и сравнить с точными значениями f(x(j))-F(x(j))
2. Вывести на экран графики f(x),F(x)
f(x)=1/x
a=0.1
b=1.1
x(j) меняется от 0,1 до 1,5 с шагом 0,04
Это все нужно сделать по формуле Бесселя
число n варьировать от 4 до 10

Вот код
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream>
#include<cmath>
using namespace std;
double f(double x)
{
    double fn=pow(x,-1);
    return fn;
}
double F (double x, int n) //функция подсчета приближенного значения функции в точке.
 
    // построение таблицы разностей
 
{
    double a=0.1, b=1.1; // аргумент первого и последнего узла интерполяции
    // n -колличество узлов интерполяции
    double h=(b-a)/(2*n); //шаг между узлами интерполяции
    double * x_arg = new double [n+n+1]; //массив аргументов функции в узлах интерполяции
    //cout<<"seredina: "<<xp[0]<<" "<<endl<<"h: "<<h<<endl;
    int s=0;//тут введена х чтоб умножать h на положит
    for (int i=-n; i<=n; ++i) 
    {
 
        x_arg[i]=a+s*h; s++;// заполнение массива аргументов от -n до n
        //cout<<x_arg[i]<<" ";
    }
    //cout<<endl<<"___________________"<<endl;
    //cout<<endl<<endl;
 
    //-------------------------------------------------------------------------------------------------------------------
    int smin=0;
    double min=fabs(x-x_arg[0]);
    for (int i=-(n-1);i<n;i++)
    {
        if (fabs(x-x_arg[i])<min)
        {
            smin=i;min=fabs(x-x_arg[i]);
        }
 
    }
    //cout<<" blizhe vseh k : "<<x_arg[smin]<<endl;
    x_arg[0]=x_arg[smin];
    if((x_arg[0]-a)<(b-x_arg[0]))b=2*(x_arg[0]-a);//cout<<" B: "<<b<<endl;}
    else a=b-2*(b-x_arg[0]);
    h=(b-a)/(2*n); //шаг между узлами интерполяции
    s=0;//тут введена х чтоб умножать h на положит
    for (int i=-n; i<=n; ++i) 
    {
 
        x_arg[i]=a+s*h; s++;// заполнение массива аргументов от -n до n
        //cout<<x_arg[i]<<" ";
    }
    //cout<<endl<<"___________________"<<endl;
    //cout<<endl<<endl; 
 
    //--------------------------------------------------------------------------------------------------------------------
    double ** razn= new double *[n+n+1]; //создание динамического массива для таблицы конечных разностей
    // [n+n+1]столько у нас строк в таблице
    int k=0;
    for (int i=-n;i<=n;++i)
    {
        razn[i] = new double [n+n+1+k];
        --k;// выделяем память для каждой строки определенное кол столбцов [n+n+1+k] 
        //к- уменьшает число столбцов в строчке на 1, т.к.
        //таблица разностей имеет диагональный вид
    }
    for ( int i=-n;i<=n;++i)// заполняем нулевой столбец массива значениями функции в узлах
    {
        razn [i][0]=f(x_arg[i]);
        //cout<<razn[i][0]<<" "<<endl;
    }
    //cout<<endl<<"----------------"<<endl;
    int r=n;
 
    for (int j=1;j<=n+n;++j)
    {
        for(int i=-n;i<r;++i)
        {
            int s=-i;
            razn[i][j]=razn[-(s-1)][j-1]-razn[i][j-1];//получаем таблицу разностей
            //cout<<razn[i][j]<<" "<<endl;
        }
        //cout<<endl<<"----------------"<<endl;
        r--;//это чтоб уменьшать число столбцов, в строке, приводить к диагональному виду таблицу разности
        //cout<<endl<<"----------------"<<endl;
    }
 
    // Считаем приближенное значение функции в точке
 
    double q,w1,w2,w;
    w=0;w1=1;w2=1;
    q=(x-x_arg[0])/h;
    //cout<<"q: "<<q<<" x_arg[0]: "<<x_arg[0]<<endl<<endl;
    //if(q<0.25&&q>0.75){}
    for(int i=1;i<n;i++)
    {
        w1*=(q+i-1)*(q-i)/(2*i);//cout<<endl<<" i : "<<i<<endl;
        w2*=(q-0.5)*(q-i)*(q+i-1)/(2*i+1);//умножение с присваиванием 
        w+=w1*(razn[-i][2*i]+razn[-i+1][2*i])*0.5+w2*razn[-i][2*i+1];//сложение с присваиванием
        //cout<<endl<<w<<" "<<endl;
    }
    double fn=(razn[0][0]+razn[1][0])*0.5+(q-0.5)*razn[0][1]+w;//
    return fn;
    delete [] x_arg;
    delete [] razn;
}
void main()
{
    double x;
    int n;
    n=5;
    //k=8;
    x=1;
    //cout<<F(x,n);
    for(x=0.1;x<=1.5;x+=0.04)
    {
        cout<<"x "<<x<<" \t"<<"  f(x)  "<<f(x)<<" \t"<<"  F(x)  "<<F(x,n)<<"  \t"<<"  raznost  "<<fabs(F(x,n)-f(x))<<endl;
    }
}
Использовать нужно интерполяционную формулу Бесселя
При n=5 прога не тянет, не знаю почему((
при 2, 3, 4 работает
Ребят помогите пожалуйста парюсь с этой задачей уже какую неделю((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2011, 17:57     задачка по вычислению интерполянта
Посмотрите здесь:

написать прогу по вычислению... C++
задачеа по вычислению значения C++
C++ программа по вычислению последовательности чисел
задача сводится к вычислению ближайшего сверху числа степени 2 C++
C++ В С++ программа по вычислению функций
C++ Баг в программе по вычислению обратной матрицы
C++ Написать по вычислению величины Z.
задание по вычислению даты C++

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

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

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