Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # include <iostream>
- # include <math.h>
- # include <conio.h>
- # include <stdlib.h>
- #include <fstream>
- using namespace std;
- int flag[11][11];
- const int n = 10;
- double x[n + 1] = { 0.2740, 0.4390, 0.6040, 0.7690, 0.9340, 1.0990, 1.2640, 1.4290, 1.5940, 1.7590, 1.9240 };
- double y[n + 1] = { -0.2090, -0.0510, 0.0120, 0.0100, -0.0290, -0.0820, -0.1200, -0.1170, -0.0440, 0.12300, 0.4130 };
- double z[3] = { 1.2230, 1.6830, 1.7640 };
- fstream output("output.txt");
- double delt(int, int);
- double Newt_F(double);
- double Newt_B(double);
- double Stirl(int, double);
- double delt(int m, int k)
- {
- double d;
- if (m == 1) { d = y[k + 1] - y[k]; }
- else { d = delt(m - 1, k + 1) - delt(m - 1, k); }
- if (m == 1 && flag[1][k] == 0)
- {
- output << "Разделенная разность дельта в степени " << m << " F с индексом " << k << " равна " << d << endl;
- flag[1][k] = 1;
- }
- return d;
- };
- double Newt_F(double q)
- {
- double S, Q, p; int i;
- Q = 1; S = y[0];p = 1;
- for (i = 1;i <= n;i++)
- {
- Q = Q*(q - i + 1);
- p = p*i;
- S = S + (Q / p)*delt(i, 0);
- }
- return (S);
- }
- double Newt_B(double q)
- {
- double S, Q, p; int i;
- Q = 1; S = y[n]; p = 1;
- for (i = 1;i <= n;i++)
- {
- Q = Q*(q + i - 1);
- p = p*i;
- S = S + (Q / p)*delt(i, n - i);
- // output << "Итерполяция назад: " << "Разность номер " << i << " равна " << S << endl;
- }
- return (S);
- }
- double Stirl(int d, double q)
- {
- double S, Q = 1, p1 = 1, p2 = 1; int t, i;
- if (d>(n - d)) { t = n - d; }
- else { t = d; }
- S = y[d];
- //output << "Методом Стирлинга: " << "Разность номер 1 равна " << S << endl;
- for (i = 1;i <= t;i++)
- {
- p1 = p2*(2 * i - 1); p2 = p1 * 2 * i;
- S = S + (q*Q / p1)*(delt(2 * i - 1, t - i) + delt(2 * i - 1, t - i + 1)) / 2;
- S = S + ((q*q)*Q / p2)*delt(2 * i, t - i);
- Q = Q*(q*q - i*i);
- //output << "Методом Стирлинга: " << "Разность номер " << i+1 << " равна " << S << endl;
- }
- return S;
- }
- int main()
- {
- setlocale(LC_ALL, "rus");
- int i, j, d; double mn, b, q;
- for (i = 1;i<2;i++)
- {
- for (int p = 0; p < 11; p++)
- for (int j = 0; j < 11; j++)
- flag[p][j] = 0;
- b = z[i];
- cout << "\n\n***Программа вычисляет значение в точке x[" << i + 1
- << "] = " << b << " *** ";
- mn = 10000;
- for (j = 1;j <= n;j++)
- {
- if (fabs(x[j] - b)<mn)
- {
- mn = fabs(x[j] - b);
- d = j;
- }
- }
- if ((d>(n - 4) / 2) & (d <= (n + 4) / 2) & (mn / (x[2] = x[1])<0.25))
- {
- q = fabs(b - x[d]) / (x[1] - x[0]);
- cout << "\n Расчет ведется метолом Стирлинга "
- << "\n Результат: " << Stirl(d, q);
- }
- else
- if ((n - d)>n / 2)
- {
- q = (b - x[0]) / (x[1] - x[0]);
- cout << "\n Расчет ведется методом Ньютона для интерполяции вперед"
- << "\n Результат: " << Newt_F(q);
- }
- else
- {
- q = (-x[n] + b) / (x[1] - x[0]);
- cout << "\n Расчет ведется методом Ньютона для интерполяции назад"
- << "\n Результат: " << Newt_B(q);
- };
- }
- getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement