Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.24 KB | None | 0 0
  1. private void button2_Click(object sender, EventArgs e)
  2. {
  3. ClearForm(); // išvalomi programos duomenys
  4. Inter = chart1.Series.Add("Interpoliavimo kreivė");
  5. Inter.ChartType = SeriesChartType.Line;
  6. chart1.ChartAreas[0].AxisY.Maximum = 17;
  7. chart1.ChartAreas[0].AxisY.Minimum= -5;
  8. chart1.ChartAreas[0].AxisX.Maximum = 35;
  9. chart1.ChartAreas[0].AxisX.Minimum = 0;
  10. float[] X = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f, 31.0f, 32.0f, 33.0f, 34.0f };
  11. float[] Y = { 4.4f, 5.4f, 5.9f, 6.3f, 6.5f, 6.8f, 6.9f, 7.0f, 7.1f, 7.2f, 7.3f, 7.5f, 8.0f, 8.5f, 9.0f, 9.4f, 9.7f, 9.8f, 9.9f, 9.9f, 9.8f, 9.7f, 9.5f, 9.3f, 9.2f, 9.0f, 8.7f, 8.5f, 8.2f, 7.9f, 7.8f, 7.7f, 7.6f, 5.8f };
  12. float[] X22 = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f, 31.0f, 32.0f, 33.0f, 34.0f };
  13. float[] Y22 = { 2.7f, 1.5f, 1.4f, 1.5f, 0.9f, 0.8f, 0.8f, 1.2f, 2.3f, 1.2f, 1.4f, 1.4f, 1.4f, 1.4f, 1.4f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.4f, 2.8f, 1.6f, 1.2f, 1.1f, 1.2f, 1.8f, 2.4f, 2.1f, 2.4f, 2.9f };
  14. float[] X2 = new float[X22.Length];
  15. float[] Y2 = new float[Y22.Length];
  16. for (int i = 0; i < X22.Length; i++)
  17. {
  18. X2[i] = X22[X22.Length - i - 1];
  19. Y2[i] = Y22[X22.Length - i - 1];
  20. }
  21. int nP = X.Length; // interpoliavimo tašku skaičius
  22. float[] t = new float[nP];
  23. t[0] = 0;
  24. for (int i = 1; i < nP; i++)
  25. {
  26. Vector<float> temp = Vector<float>.Build.DenseOfArray(new float[] { X[i] - X[i - 1], Y[i] - Y[i - 1] });
  27. t[i] = t[i - 1] + (float)temp.L2Norm();
  28. }
  29. float[] DX = Akima(t, X);
  30. float[] DY = Akima(t, Y);
  31. Ermito_splainu_parametrinis_interpoliavimas(X, DX, Y, DY, t);
  32.  
  33. nP = X2.Length; // interpoliavimo tašku skaičius
  34. float[] t2 = new float[nP];
  35. t2[0] = 0;
  36. for (int i = 1; i < nP; i++)
  37. {
  38. Vector<float> temp = Vector<float>.Build.DenseOfArray(new float[] { X2[i] - X2[i - 1], Y2[i] - Y2[i - 1] });
  39. t2[i] = t2[i - 1] + (float)temp.L2Norm();
  40. }
  41. DX = Akima(t2, X2);
  42. DY = Akima(t2, Y2);
  43. Ermito_splainu_parametrinis_interpoliavimas(X2, DX, Y2, DY, t2);
  44. }
  45.  
  46. public void Ermito_splainu_parametrinis_interpoliavimas(float[] X, float[] DX, float[] Y, float[] DY, float[] t) {
  47. int nP = X.Length; // interpoliavimo tasku skaicius
  48. for (int iii = 0; iii < nP-1; iii++)
  49. {
  50. int nnn = 100;
  51. float[] ttt = new float[nnn+1];
  52. for (int i = 0; i <= nnn; i++)
  53. {
  54. ttt[i] = t[iii] + i * (t[iii + 1] - t[iii]) / nnn;
  55. }
  56. float[] fffX = new float[nnn + 1];
  57. float[] fffY = new float[nnn + 1];
  58. for (int j = 0; j <= 1; j++)
  59. {
  60. float[] temp = new float[2];
  61. temp[0] = t[iii];
  62. temp[1] = t[iii + 1];
  63. float [] U = Hermite(temp, j, ttt);
  64. float[] V = Hermite2(temp, j, ttt);
  65. for (int i = 0; i <= nnn; i++)
  66. {
  67. fffY[i] = fffY[i] + U[i] * Y[iii + j] + V[i] * DY[iii + j];
  68. fffX[i] = fffX[i] + U[i] * X[iii + j] + V[i] * DX[iii + j];
  69. }
  70.  
  71. }
  72. for (int i = 0; i <= nnn; i++)
  73. {
  74. Inter.Points.AddXY(fffX[i], fffY[i]);
  75. }
  76. }
  77. }
  78.  
  79. public float[] Akima(float[] X, float[] Y)
  80. {
  81. int n = X.Length;
  82. float[] DY = new float[n];
  83. for (int i=0;i< n; i++)
  84. {
  85. if (i == 0)
  86. {
  87. float xim1 = X[0];
  88. float xi = X[1];
  89. float xip1 = X[2];
  90. float yim1 = Y[0];
  91. float yi = Y[1];
  92. float yip1 = Y[2];
  93. DY[i] = (2 * xim1 - xi - xip1) / ((xim1 - xi) * (xim1 - xip1)) * yim1 + (2 * xim1 - xim1 - xip1) / ((xi - xim1) * (xi - xip1)) * yi + (2 * xim1 - xim1 - xi) / ((xip1 - xim1) * (xip1 - xi)) * yip1;
  94. }
  95. else if(i== n-1)
  96. {
  97. float xim1 = X[n - 3];
  98. float xi = X[n - 2];
  99. float xip1 = X[n-1];
  100. float yim1 = Y[n - 3];
  101. float yi = Y[n - 2];
  102. float yip1 = Y[n-1];
  103. DY[i] = (2 * xip1 - xi - xip1) / ((xim1 - xi) * (xim1 - xip1)) * yim1 + (2 * xip1 - xim1 - xip1) / ((xi - xim1) * (xi - xip1)) * yi + (2 * xip1 - xim1 - xi) / ((xip1 - xim1) * (xip1 - xi)) * yip1;
  104. }
  105. else
  106. {
  107. float xim1 = X[i - 1];
  108. float xi = X[i];
  109. float xip1 = X[i + 1];
  110. float yim1 = Y[i - 1];
  111. float yi = Y[i];
  112. float yip1 = Y[i + 1];
  113. DY[i] = (2 * xi - xi - xip1) / ((xim1 - xi) * (xim1 - xip1)) * yim1 + (2 * xi - xim1 - xip1) / ((xi - xim1) * (xi - xip1)) * yi + (2 * xi - xim1 - xi) / ((xip1 - xim1) * (xip1 - xi)) * yip1;
  114. }
  115. }
  116. return DY;
  117. }
  118.  
  119. private float[] Hermite(float[] X, int j, float[] x) {
  120. float[] L = Lagranzo(X, j, x);
  121. float DL = D_Lagrange(X, j, X[j]);
  122. float[] U = new float[x.Length];
  123. float[] V = new float[x.Length];
  124. for (int i = 0; i < x.Length; i++) {
  125. U[i] = (float)((1 - 2 * DL * (x[i] - X[j])) * Math.Pow(L[i], 2));
  126. V[i] = (float)((x[i] - X[j]) * Math.Pow(L[i],2));
  127. }
  128. return U;
  129. }
  130.  
  131. private float[] Hermite2(float[] X, int j, float[] x)
  132. {
  133. float[] L = Lagranzo(X, j, x);
  134. float DL = D_Lagrange(X, j, X[j]);
  135. float[] U = new float[x.Length];
  136. float[] V = new float[x.Length];
  137. for (int i = 0; i < x.Length; i++)
  138. {
  139. U[i] = (float)((1 - 2 * DL * (x[i] - X[j])) * Math.Pow(L[i], 2));
  140. V[i] = (float)((x[i] - X[j]) * Math.Pow(L[i], 2));
  141. }
  142. return V;
  143. }
  144.  
  145. public float[] Lagranzo(float[] X, int j, float[] x)
  146. {
  147. int n = X.Length;
  148. float[] L = new float[x.Length];
  149. for (int tt = 0; tt < x.Length; tt++)
  150. L[tt] = 1;
  151. for (int k = 0; k < n; k++) {
  152. if (k != j)
  153. for (int tt = 0; tt < x.Length; tt++)
  154. L[tt] = L[tt] * (x[tt] - X[k]) / (X[j] - X[k]);
  155. }
  156. return L;
  157. }
  158.  
  159. private float D_Lagrange(float[] X, int j, float x) {
  160. int n = X.Length;
  161. float DL = 0; // DL israskos skaitiklis
  162. for (int i = 0; i < n; i++)
  163. {
  164. if (i != j)
  165. {
  166. float Lds = 1;
  167. for (int k = 0; k < n; k++)
  168. {
  169. if (k != j && k != i)
  170. {
  171. Lds = Lds * (x - X[k]);
  172. }
  173. }
  174. DL = DL + Lds;
  175. }
  176. }
  177. float Ldv = 1; // DL israskos vardiklis
  178. for (int k = 0; k<n; k++)
  179. {
  180. if (k != j)
  181. {
  182. Ldv = Ldv * (X[j] - X[k]);
  183. }
  184. }
  185. DL = DL / Ldv;
  186. return DL;
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement