Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <math.h>
- #include <cmath>
- #include <vector>
- #include <Windows.h>
- #include <stdlib.h>
- #include <fstream>
- #include <string.h>
- #include <time.h>
- #include <iomanip>
- using namespace std;
- /* Рандом даёт ток целое число, поэтому отказались от этого
- int flag = 0;
- double r,h;
- h = (Array[CountSegments + 1].x - Array[0].x) / CountSegments;
- if (CountSegments % 2 == 0)
- flag = 1;
- if (flag == 1) {
- for (int i = 1; i < CountSegments + 1; i=i+2) {
- r = (rand() % h + 1);
- Array[i].x = h + r;
- Array[i].y = (*f)(Array[i].x);
- Array[i + 1].x = h - r;
- Array[i + 1].y = (*f)(Array[i + 1].x);
- }
- }
- else {
- Array[1].x = Array[0].x+h;
- Array[1].y = (*f)(Array[1].x);
- for (int i = 2; i < CountSegments; i=i+2) {
- r = (rand() % 3 + 1);
- Array[i].x = h+r;
- Array[i].y = (*f)(Array[i].x);
- Array[i+1].x = h-r;
- Array[i+1].y = (*f)(Array[i+1].x);
- }
- }
- */
- typedef double(*functiontype)(double x);
- typedef struct Node
- {
- double x, y;
- } Node;
- typedef double(*method)(double x, Node* Array, int Count, double* DD_massiv);
- typedef struct Interval
- {
- double InitialNode, EndNode;
- } Interval;
- const double PI = 3.141592653589793238463;
- double Myfunc(double x)
- {
- return x;
- }
- functiontype Func = &Myfunc;
- //Равномерная сетка
- void ValueUniformTable(functiontype* f, Node* Array, double Initial, double End, int CountSegments)
- {
- int i;
- double alpha, h;
- Array[0].x = Initial;
- Array[CountSegments].x = End;
- Array[0].y = (*f)(Array[0].x);
- Array[CountSegments].y = (*f)(Array[CountSegments].x);
- h = (Array[CountSegments].x - Array[0].x) / CountSegments;
- cout << "(" << Array[0].x << ":" << Array[0].y << ")" << endl;
- for (int i = 1; i < CountSegments; i++)
- {
- Array[i].x = Array[i - 1].x + h;
- Array[i].y = (*f)(Array[i].x);
- cout << "(" << Array[i].x << ":" << Array[i].y << ")" << endl;
- }
- cout << "(" << Array[CountSegments].x << ":" << Array[CountSegments].y << ")" << endl;
- }
- //Неравномерная сетка
- void ValueIrregularTable(functiontype* f, Node* Array, double Initial, double End, int CountSegments, double *Array_steps) //Инитиал и Енд запихать в Array
- {
- int i;
- double alpha,h;
- Array[0].x = Initial;
- Array[CountSegments].x = End;
- Array[0].y = (*f)(Array[0].x);
- Array[CountSegments].y = (*f)(Array[CountSegments].x);
- h = (Array[CountSegments].x - Array[0].x) / CountSegments;
- Array_steps[0] = 0;
- alpha = 2 * PI / CountSegments;
- cout << "(" << Array[0].x << ":" << Array[0].y << ")" << endl;
- for (i = 1; i < CountSegments; i++) {
- Array_steps[i] = h + cos(alpha*i);
- Array[i].x = Array[i-1].x+ Array_steps[i];
- Array[i].y = (*f)(Array[i].x);
- cout << "(" << Array[i].x << ":" << Array[i].y << ")" << endl;
- }
- Array_steps[CountSegments] = Array[CountSegments].x - Array[CountSegments - 1].x;
- cout << "(" << Array[CountSegments].x << ":" << Array[CountSegments ].y << ")" << endl;
- }
- /* Принимает на вход коэффициенты матриц в виде массива. Заполняет массив прогоночных коэффициентов
- matrix_coeffs - двумерный массив вида [[a1,b1,c1,d1],[a2,b2,c2,d2],...,[an,bn,cn,dn]
- надо сделать чтобы а1=с1=0, переделать под ашки
- */
- void tridiagonal_matrix_algorithm(double** matrix_coeffs, int matrix_size) {
- int i;
- double denominator;
- double K, E, K_prev = 0, E_prev = 0; //Прогоночные коэффициенты
- double* x_massiv = new double[matrix_size];
- double** coeffs_massiv; //Двумерный массив, хранящий прогоночные коэффициенты, 0 - Кси, 1 - Эта
- coeffs_massiv = new double*[matrix_size+1];
- for (i = 0; i < matrix_size; i++)
- coeffs_massiv[i] = new double[2];
- coeffs_massiv[0][0] = 0; coeffs_massiv[0][1] = 0;
- matrix_coeffs[0][0] = 0; matrix_coeffs[matrix_size - 1][2] = 0; //а1=с1=0
- //Прямой ход
- for (i = 1; i <= matrix_size; i++) { //Ищем K_i+1 и E_i+1 на iом шаге
- denominator = (matrix_coeffs[i - 1][0] * K_prev + matrix_coeffs[i - 1][1]);
- K = -(matrix_coeffs[i - 1][2]) / denominator;
- E = (matrix_coeffs[i - 1][3] - matrix_coeffs[i - 1][0] * E_prev) / denominator;
- K_prev = K;
- E_prev = E;
- coeffs_massiv[i][0] = K; coeffs_massiv[i][1] = E;
- }
- //Обратный ход
- x_massiv[matrix_size - 1] = coeffs_massiv[matrix_size][1];
- for (i = matrix_size - 2; i >= 0; i--) {
- x_massiv[i] = coeffs_massiv[i + 1][0] * x_massiv[i + 1] + coeffs_massiv[i + 1][1];
- }
- }
- void get_matrix_coeffs(double Initial, double End, int matrix_size, functiontype* f, double** matrix_coeffs, Node* Array, double *Array_steps) {
- int i;
- double h1,h2,h_prev;
- //double* gamma_massiv = new double[matrix_size]; //Гаммы яв решением ур, т.е. ответом.
- for (i = 1; i <= matrix_size; i++) {
- h1 = Array_steps[i]; //i
- h2 = Array_steps[i+1];; //i+1
- h_prev = h2;
- matrix_coeffs[i - 1][0] = h1;
- matrix_coeffs[i - 1][1] = 2*(h1+h2);
- matrix_coeffs[i - 1][2] = h2;
- matrix_coeffs[i - 1][3] = 6*( (Array[i+1].y- Array[i].y) / h2 - (Array[i].y - Array[i-1].y)/h1 );
- //cout << matrix_coeffs[i - 1][0] << " " << matrix_coeffs[i - 1][1] << " " << matrix_coeffs[i - 1][2] << " " << endl;
- }
- //matrix_coeffs[matrix_size][3] = 6 * ((Array[i + 1].y - Array[i].y) / h2 - (Array[i].y - Array[i - 1].y) / h1);
- h1 = Array_steps[matrix_size];
- h2 = Array_steps[matrix_size+1];
- y1 = Array[matrix_size].y;
- y2 = Array[matrix_size + 1].y;
- x1 = Array[matrix_size].x;
- x2 = Array[matrix_size + 1].x;
- matrix_coeffs[matrix_size-1][0] = h1;
- matrix_coeffs[matrix_size-1][1] = 2 * (h1 + h2);
- matrix_coeffs[matrix_size - 1][2] = 0;
- matrix_coeffs[matrix_size-1][3] = 6 * ((Array[i + 1].y - Array[i].y) / h2 - (Array[i].y - Array[i - 1].y) / h1);
- matrix_coeffs[0][0] = 0;
- d2 = h2/6 * 6*(B*h2- y2+ y1) / ( (x2- x1)*(x2 - x1)*((x2 - x1)-h2*h2) )
- g2 = h2/6 * h2*h2 / ( (x2-x1)*( (x2-x1)*(x2-x1)-h2*h2 ))
- }
- int main()
- {
- setlocale(LC_ALL, "RUS");
- functiontype Func = &Myfunc;
- double Initial = 0, End = 5;
- int CountSegments,i;
- cout << "Введите N: ";
- cin >> CountSegments;
- cout << "Точек: " << CountSegments + 1 << endl << endl;
- double *Array_steps = new double[CountSegments + 1];
- //Построение сетки
- cout << "Равномерная Сетка: " << endl;
- Node* ArrayUniformNodes = new Node[CountSegments+1];
- ValueUniformTable(&Func, ArrayUniformNodes, Initial, End, CountSegments);
- cout << endl << "Неравномерная Сетка: " << endl;
- Node* ArrayIrregulaNodes = new Node[CountSegments + 1];
- ValueIrregularTable(&Func, ArrayIrregulaNodes, Initial, End, CountSegments, Array_steps);
- cout << endl;
- //Заполнение массива коэффициентами матрицы
- double** matrix_coeffs;
- matrix_coeffs = new double*[CountSegments-1];
- for (i = 0; i < CountSegments-1; i++)
- matrix_coeffs[i] = new double[3];
- cout << "Полученная матрица: " << endl;
- get_matrix_coeffs(Initial,End, CountSegments-1, &Func, matrix_coeffs, ArrayIrregulaNodes, Array_steps);
- /*
- //Получение ответа в x_massiv
- double* x_massiv = new double[CountSegments+1];
- tridiagonal_matrix_algorithm(matrix_coeffs, CountSegments+1);
- */
- cout << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement