вообщем есть задачка
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 работает
Ребят помогите пожалуйста парюсь с этой задачей уже какую неделю((