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;
- 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;
- void ValueUniformTable(functiontype* f, Node* Array, double Initial, double End, int CountNodes)
- {
- double step = abs(Initial - End) / (CountNodes - 1);
- Array[0].x = Initial;
- Array[0].y = (*f)(Array[0].x);
- for (int i = 1; i < CountNodes; i++)
- {
- Array[i].x = Array[i - 1].x + step;
- }
- }
- double Myfunc(double x)
- {
- return x * sin(x);
- }
- functiontype Func = &Myfunc;
- //Принимает на вход коэффициенты матриц в виде массива. Заполняет массив прогоночных коэффициентов
- /* 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];
- }
- }
- int main()
- {
- setlocale(LC_ALL, "RUS");
- functiontype Func = &Myfunc;
- Interval Interval; Interval.InitialNode = 0;
- Interval.EndNode = 4;
- //Interval.EndNode = 1.5;
- int CountSegments, СountDots = 1000;
- cout << "Введите число интервалов разбиения: " << endl; cin >> CountSegments; cout << endl;
- int CountNodes = CountSegments + 1;
- Node* ArrayUniformNodes = new Node[CountNodes];
- ValueUniformTable(&Func, ArrayUniformNodes, Interval.InitialNode, Interval.EndNode, CountNodes);
- cout << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment