Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //подключение библиотек и заголовочных файлов
- #include "Spline.h"
- #include <iostream>
- #include <cmath>
- void cwert(double** mmm, double xxx, int row)
- {
- double *alpha = new double[row-1];
- double *beta = new double[row-1];
- double *c = new double[row-1];
- double A, B, C, F, h, h1, z, D, e;
- alpha[0] = 0;
- beta[0] = 0;
- c[0] = 0;
- for (int i = 1; i < row-1; i++)
- {
- //вычисление коэффициентов полиномов
- h = mmm[0][i] - mmm[0][i - 1];
- h1 = mmm[0][i + 1] - mmm[0][i];
- A = h;
- B = 2.*(h + h1);
- C = h1;
- D = 6.*((mmm[1][i + 1] - mmm[1][i]) / h1 - (mmm[1][i] - mmm[1][i - 1]) / h);
- e = A*alpha[i - 1] + B;
- alpha[i] = -C / e;
- beta[i] = (D - A*beta[i - 1]) / e;
- }
- c[row - 1] = (D - A*beta[row - 2]) / (B + A*alpha[row - 2]);
- for (int i = row-2; i > 0; i--)
- {
- c[i] = alpha[i] * c[i + 1] + beta[i];
- }
- }
- double S(double** mmm, double xxx, int row, double *aa, double *bb, double *cc, double *dd)
- {
- cwert(mmm, xxx, row);
- double S = 0;
- double h;
- for (int i = row-1; i >= 0; i--)
- {
- dd[i] = cc[i] = bb[i] = aa[i] = 0;
- }
- for (int i = row-1; i >= 0; i--)
- {
- h = mmm[0][i] - mmm[0][i - 1];
- aa[i] = mmm[1][i];
- dd[i] = (cc[i] - cc[i - 1]) / h;
- bb[i] = 0.5*h*cc[i] - (1 / 6.)*h*h*dd[i] + (mmm[1][i] - mmm[1][i - 1]) / h;
- }
- for (int i = 1; i < row-1; i++)
- {
- S = aa[i] + bb[i] * (xxx - mmm[i][0]) + (cc[i] / 2) * pow((xxx - mmm[i][0]), 2) + (dd[i] / 6) * pow((xxx - mmm[i][0]), 3);//вычисление по формуле
- }
- return S;
- }
- if (checkBox1->Checked)
- {
- String^ Line;
- array<String^>^ strArr;
- array<Char>^ charArr = { ' ', 'n' };
- try
- {
- FileStream^ fs = gcnew FileStream("input.txt", FileMode::Open);
- StreamReader^ sr = gcnew StreamReader(fs, Encoding::UTF8);
- int i = 0;
- while (sr->EndOfStream != true) // framework 2.0
- {
- sr->ReadLine();
- i++;
- }
- input->RowCount = i;
- i = 0;
- sr->DiscardBufferedData();
- sr->BaseStream->Seek(0, IO::SeekOrigin::Begin);
- while (sr->EndOfStream != true) // framework 2.0
- {
- Line = sr->ReadLine();
- strArr = Line->Split(charArr);
- /*for (int i = 0; i < strArr->Length; i++)
- {
- MessageBox::Show(strArr[i]->Trim());
- }*/
- input->Rows[i]->Cells["X"]->Value = strArr[0]->Trim();
- input->Rows[i]->Cells["Y"]->Value = strArr[1]->Trim();
- //
- i++;
- // MessageBox::Show(Convert::ToString(input->RowCount));
- }
- sr->Close();
- }
- catch (Exception^ ex) {
- //MessageBox::Show(ex->Message);
- }
- }
- private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
- chart1->Series["Spline"]->Points->Clear();//очистка линий
- chart1->Series["Line"]->Points->Clear();//очистка линий
- if (checkBox1->Checked)
- {
- String^ Line;
- array<String^>^ strArr;
- array<Char>^ charArr = { ' ', 'n' };
- try
- {
- FileStream^ fs = gcnew FileStream("input.txt", FileMode::Open);
- StreamReader^ sr = gcnew StreamReader(fs, Encoding::UTF8);
- int i = 0;
- while (sr->EndOfStream != true) // framework 2.0
- {
- sr->ReadLine();
- i++;
- }
- input->RowCount = i;
- i = 0;
- sr->DiscardBufferedData();
- sr->BaseStream->Seek(0, IO::SeekOrigin::Begin);
- while (sr->EndOfStream != true) // framework 2.0
- {
- Line = sr->ReadLine();
- strArr = Line->Split(charArr);
- /*for (int i = 0; i < strArr->Length; i++)
- {
- MessageBox::Show(strArr[i]->Trim());
- }*/
- input->Rows[i]->Cells["X"]->Value = strArr[0]->Trim();
- input->Rows[i]->Cells["Y"]->Value = strArr[1]->Trim();
- //
- i++;
- // MessageBox::Show(Convert::ToString(input->RowCount));
- }
- sr->Close();
- }
- catch (Exception^ ex) {
- //MessageBox::Show(ex->Message);
- }
- }
- int row = input->RowCount;//подстчет количество введеных данных
- double **mmm = new double *[row-1];//создание массива
- for (int i = 0; i < row-1; i++)
- {
- mmm[i] = new double[2];//в массиве 2 колонки
- }
- for (int i = 0; i < row-1; i++)
- {
- mmm[i][0] = Convert::ToDouble(input->Rows[i]->Cells["X"]->Value->ToString());//конвертировать строку в число
- mmm[i][1] = Convert::ToDouble(input->Rows[i]->Cells["Y"]->Value->ToString());
- if (checkBox3->Checked)
- {
- chart1->Series["Line"]->Points->Clear();//очистка линии сплайна
- chart1->Series["Spline"]->Points->AddXY(mmm[i][0], mmm[i][1]);//добавление на график точек
- }
- }
- double xxx, g;
- double *aa = new double[row-1];
- double *bb = new double[row-1];
- double *cc = new double[row-1];
- double *dd = new double[row-1];
- for (int i = 0; i < row-1; i++)
- {
- if (checkBox3->Checked)
- {
- xxx = mmm[i][2];
- g = S(mmm, xxx, row-1, aa, bb, cc, dd);//результат
- chart1->Series["Line"]->Points->Clear();
- chart1->Series["Spline"]->Points->AddXY(xxx, g);
- std::ofstream ff("cubic.txt", std::ios_base::out);
- if (ff.is_open())
- {
- ff << "Работа программы кубического сплайна :" << std::endl;
- ff << "результ. по точкам " << g << "n" << "время " << clock() / 1000.0 << std::endl;
- for (int i = 0; i < row-1; i++)
- {
- //ff << "F(x)=" << i << " " << mmm[i][1] << "+" << mmm[i][2] << "+" << mmm[i][1] / 2 << "+" << mmm[i][1] / 6 << "+" << mmm[i][2];
- ff << "F(x)=" << i << " ";//запись
- ff << std::endl;
- ff << mmm[i][0] << " " << mmm[i][1];//запись
- ff << "n------------------rn" << " " << aa[i] << "+" << " " << bb[i] << "*" << " " << "(x - " << mmm[i][0] << ")" << " " << "+" << cc[i] << "*" << " " <<"(x - " << mmm[i][0] << ")^2" << " " << "+" << dd[i]/6. << "*" << " " << "(x - " << mmm[i][0] << ")^3";
- ff << std::endl;
- }
- ff << std::endl;
- ff << "------------------nr" << std::endl;
- }
- else
- ff << errno;
- ff.close();
- }
- }
- }
Add Comment
Please, Sign In to add comment