Guest User

Untitled

a guest
Feb 25th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.86 KB | None | 0 0
  1. //подключение библиотек и заголовочных файлов
  2. #include "Spline.h"
  3. #include <iostream>
  4. #include <cmath>
  5.  
  6. void cwert(double** mmm, double xxx, int row)
  7. {
  8. double *alpha = new double[row-1];
  9. double *beta = new double[row-1];
  10. double *c = new double[row-1];
  11. double A, B, C, F, h, h1, z, D, e;
  12.  
  13. alpha[0] = 0;
  14. beta[0] = 0;
  15. c[0] = 0;
  16.  
  17. for (int i = 1; i < row-1; i++)
  18. {
  19. //вычисление коэффициентов полиномов
  20. h = mmm[0][i] - mmm[0][i - 1];
  21. h1 = mmm[0][i + 1] - mmm[0][i];
  22. A = h;
  23. B = 2.*(h + h1);
  24. C = h1;
  25. D = 6.*((mmm[1][i + 1] - mmm[1][i]) / h1 - (mmm[1][i] - mmm[1][i - 1]) / h);
  26. e = A*alpha[i - 1] + B;
  27. alpha[i] = -C / e;
  28. beta[i] = (D - A*beta[i - 1]) / e;
  29. }
  30. c[row - 1] = (D - A*beta[row - 2]) / (B + A*alpha[row - 2]);
  31.  
  32. for (int i = row-2; i > 0; i--)
  33. {
  34. c[i] = alpha[i] * c[i + 1] + beta[i];
  35. }
  36. }
  37.  
  38. double S(double** mmm, double xxx, int row, double *aa, double *bb, double *cc, double *dd)
  39. {
  40. cwert(mmm, xxx, row);
  41.  
  42. double S = 0;
  43. double h;
  44. for (int i = row-1; i >= 0; i--)
  45. {
  46. dd[i] = cc[i] = bb[i] = aa[i] = 0;
  47. }
  48.  
  49. for (int i = row-1; i >= 0; i--)
  50. {
  51. h = mmm[0][i] - mmm[0][i - 1];
  52. aa[i] = mmm[1][i];
  53. dd[i] = (cc[i] - cc[i - 1]) / h;
  54. bb[i] = 0.5*h*cc[i] - (1 / 6.)*h*h*dd[i] + (mmm[1][i] - mmm[1][i - 1]) / h;
  55. }
  56.  
  57. for (int i = 1; i < row-1; i++)
  58. {
  59. 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);//вычисление по формуле
  60. }
  61.  
  62. return S;
  63. }
  64.  
  65. if (checkBox1->Checked)
  66. {
  67. String^ Line;
  68. array<String^>^ strArr;
  69. array<Char>^ charArr = { ' ', 'n' };
  70. try
  71. {
  72. FileStream^ fs = gcnew FileStream("input.txt", FileMode::Open);
  73. StreamReader^ sr = gcnew StreamReader(fs, Encoding::UTF8);
  74. int i = 0;
  75. while (sr->EndOfStream != true) // framework 2.0
  76. {
  77. sr->ReadLine();
  78. i++;
  79. }
  80. input->RowCount = i;
  81. i = 0;
  82.  
  83. sr->DiscardBufferedData();
  84. sr->BaseStream->Seek(0, IO::SeekOrigin::Begin);
  85. while (sr->EndOfStream != true) // framework 2.0
  86. {
  87. Line = sr->ReadLine();
  88. strArr = Line->Split(charArr);
  89. /*for (int i = 0; i < strArr->Length; i++)
  90. {
  91. MessageBox::Show(strArr[i]->Trim());
  92. }*/
  93. input->Rows[i]->Cells["X"]->Value = strArr[0]->Trim();
  94. input->Rows[i]->Cells["Y"]->Value = strArr[1]->Trim();
  95. //
  96. i++;
  97. // MessageBox::Show(Convert::ToString(input->RowCount));
  98. }
  99. sr->Close();
  100. }
  101. catch (Exception^ ex) {
  102. //MessageBox::Show(ex->Message);
  103. }
  104. }
  105.  
  106. private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
  107. chart1->Series["Spline"]->Points->Clear();//очистка линий
  108. chart1->Series["Line"]->Points->Clear();//очистка линий
  109.  
  110. if (checkBox1->Checked)
  111. {
  112. String^ Line;
  113. array<String^>^ strArr;
  114. array<Char>^ charArr = { ' ', 'n' };
  115. try
  116. {
  117. FileStream^ fs = gcnew FileStream("input.txt", FileMode::Open);
  118. StreamReader^ sr = gcnew StreamReader(fs, Encoding::UTF8);
  119. int i = 0;
  120. while (sr->EndOfStream != true) // framework 2.0
  121. {
  122. sr->ReadLine();
  123. i++;
  124.  
  125. }
  126. input->RowCount = i;
  127. i = 0;
  128.  
  129. sr->DiscardBufferedData();
  130. sr->BaseStream->Seek(0, IO::SeekOrigin::Begin);
  131. while (sr->EndOfStream != true) // framework 2.0
  132. {
  133.  
  134. Line = sr->ReadLine();
  135. strArr = Line->Split(charArr);
  136. /*for (int i = 0; i < strArr->Length; i++)
  137. {
  138. MessageBox::Show(strArr[i]->Trim());
  139. }*/
  140. input->Rows[i]->Cells["X"]->Value = strArr[0]->Trim();
  141. input->Rows[i]->Cells["Y"]->Value = strArr[1]->Trim();
  142. //
  143. i++;
  144. // MessageBox::Show(Convert::ToString(input->RowCount));
  145. }
  146.  
  147. sr->Close();
  148. }
  149. catch (Exception^ ex) {
  150. //MessageBox::Show(ex->Message);
  151. }
  152. }
  153.  
  154. int row = input->RowCount;//подстчет количество введеных данных
  155.  
  156. double **mmm = new double *[row-1];//создание массива
  157.  
  158. for (int i = 0; i < row-1; i++)
  159. {
  160. mmm[i] = new double[2];//в массиве 2 колонки
  161. }
  162.  
  163. for (int i = 0; i < row-1; i++)
  164. {
  165. mmm[i][0] = Convert::ToDouble(input->Rows[i]->Cells["X"]->Value->ToString());//конвертировать строку в число
  166. mmm[i][1] = Convert::ToDouble(input->Rows[i]->Cells["Y"]->Value->ToString());
  167.  
  168. if (checkBox3->Checked)
  169. {
  170. chart1->Series["Line"]->Points->Clear();//очистка линии сплайна
  171. chart1->Series["Spline"]->Points->AddXY(mmm[i][0], mmm[i][1]);//добавление на график точек
  172. }
  173. }
  174.  
  175. double xxx, g;
  176. double *aa = new double[row-1];
  177. double *bb = new double[row-1];
  178. double *cc = new double[row-1];
  179. double *dd = new double[row-1];
  180.  
  181. for (int i = 0; i < row-1; i++)
  182. {
  183. if (checkBox3->Checked)
  184. {
  185. xxx = mmm[i][2];
  186. g = S(mmm, xxx, row-1, aa, bb, cc, dd);//результат
  187. chart1->Series["Line"]->Points->Clear();
  188. chart1->Series["Spline"]->Points->AddXY(xxx, g);
  189. std::ofstream ff("cubic.txt", std::ios_base::out);
  190. if (ff.is_open())
  191. {
  192. ff << "Работа программы кубического сплайна :" << std::endl;
  193. ff << "результ. по точкам " << g << "n" << "время " << clock() / 1000.0 << std::endl;
  194. for (int i = 0; i < row-1; i++)
  195. {
  196. //ff << "F(x)=" << i << " " << mmm[i][1] << "+" << mmm[i][2] << "+" << mmm[i][1] / 2 << "+" << mmm[i][1] / 6 << "+" << mmm[i][2];
  197. ff << "F(x)=" << i << " ";//запись
  198. ff << std::endl;
  199. ff << mmm[i][0] << " " << mmm[i][1];//запись
  200. 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";
  201.  
  202. ff << std::endl;
  203. }
  204. ff << std::endl;
  205. ff << "------------------nr" << std::endl;
  206. }
  207. else
  208. ff << errno;
  209. ff.close();
  210. }
  211. }
  212. }
Add Comment
Please, Sign In to add comment