Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab10 / main

.cpp
Скачиваний:
2
Добавлен:
22.12.2018
Размер:
4.02 Кб
Скачать
яю#include "pch.h"

#include <cmath>

#include <iostream>

#include <iomanip>

#define N 11

using namespace std;



const double X[] = { 0.3060, 0.4890, 0.6730, 0.8570, 1.0410, 1.2240, 1.4080 , 1.5920,1.7760, 1.9590 , 2.1430};

const double Y[] = { -0.2870, -0.0710, 0.0170, 0.0140, -0.0410, -0.1140, -0.1670, -0.1610, -0.0610, 0.1700, 0.5720 };



long factorial(int x){

	if ((x == 1) || (x == 0)) return 1;

	return x * factorial(x - 1);

}



double C(int j, int r){

	return factorial(r) / (factorial(j) * factorial(r - j));

}



double down_difference(int r, int k) {

	double S = 0;



	for (int j = 0; j <= r; j++)

		S += pow(-1, j)*C(j, r)*Y[k + r - j];

	return S;

}



double up_difference(int r, int k){

	return down_difference(r, k - r);

}



double back_Newton(double x, int n) {

	double S = Y[n], q, Q;

	q = (x - X[n]) / (X[1] - X[0]);

	Q = q;



	for (int i = 1; i <= n; i++) {

		S += Q * up_difference(i, n) / factorial(i);

		Q *= (q + i - 1 );

	}

	return S;

}



double ahead_Newton(double x,int n){

	double S = Y[0], q, Q;

	q = (x - X[0]) / (X[1] - X[0]);

	Q = q;



	for (int i = 1; i <= n; i++) {

		S += Q * down_difference(i, 0) / factorial(i);

		Q *= (q - i + 1);

	}

	return S;

}



double difference_Stirling(int r, int k){

	double S = 0;



	for (int j = 0; j <= k; j++)

		S += pow(-1, j)*C(j, k)*Y[k - j];

	return S;

}





double Stirling(double x, int z,int n) {

	double S, q, Q;

	q = abs(x - X[z]) / (X[1] - X[0]);

	S = Y[z];

	Q = 1;



	for (int i = 1; i <= n; i++) {

		S += q * Q*(difference_Stirling(2 * i - 1, i) + difference_Stirling(2 * i, i - 1)) 

		/ (factorial(2 * i - 1) * 2) + q * q*Q*difference_Stirling(2 * i, i) / factorial(2 * i);

		Q *= (q*q - i + 1);

	}

	return S;

}



int main(){

	double x1, x2, x3;

	x1 = 1.0530;

	x2 = 0.4450;

	x3 = 1.1550;



	cout << "Y1 = "<< Stirling(x1,6,N) << endl;// << fixed << setprecision(15) 

	cout << "Y2 = "  << ahead_Newton(x2,N) << endl;

	cout << "Y3 = " << Stirling(x3,5,N) << endl;

}
Соседние файлы в папке lab10