fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. namespace asdf12345zxc
  12. {
  13. public partial class Form1 : Form
  14. {
  15. double b1 = 0.3;
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. }
  20.  
  21. public double f(double x, double y, double z) // y' = z
  22. {
  23. return z;
  24. }
  25.  
  26. public double g(double x, double y, double z)
  27. {
  28. return 2 * Math.Sqrt(x) * z - x * y * (1 - y); // z' = f
  29. }
  30.  
  31. public double exSolve(double x) // точное решение
  32. {
  33. return -Math.Tan(x);
  34. }
  35.  
  36. /**
  37.   * <param name = "a"> Левая граница отрезка </param>
  38.   * <param name="b"> Правая граница отрезка </param>
  39.   * <param name="h"> Шаг по пространству </param>
  40.   * <param name="y0"> Y(a) </param>
  41.   * <param name="yb"> Y(b) </param>
  42.   * <param name="Y"> Массив решений </param>
  43.   *
  44.   */
  45. public double[,] rk4(double a, double b, double h, double y0, double yb, double[,] Y)
  46. {
  47. double[] k1 = new double[4]; //коэффиценты К
  48. double[] k2 = new double[4]; //коэффиценты К
  49. int i = 0;
  50. Y[0, 0] = y0;
  51. Y[1, 0] = yb;
  52. for (double x = a; x < b - h; x += h)
  53. {
  54. k1[0] = f(x, Y[0, i], Y[1, i]);
  55. k2[0] = g(x, Y[0, i], Y[1, i]);
  56.  
  57. k1[1] = f(x + h / 3, Y[0, i] + k1[0] * (h / 3), Y[1, i] + k2[0] * (h / 3));
  58. k2[1] = g(x + h / 3, Y[0, i] + k1[0] * (h / 3), Y[1, i] + k2[0] * (h / 3));
  59.  
  60. k1[2] = f(x + h * 2 / 3, Y[0, i] - k1[1] * (h / 3), Y[1, i] - k2[1] * (h / 3));
  61. k2[2] = g(x + h * 2 / 3, Y[0, i] - k1[1] * (h / 3), Y[1, i] - k2[1] * (h / 3));
  62.  
  63. k1[3] = f(x + h, Y[0, i] + k1[0] - k1[1] + k1[2], Y[1, i] + k1[0] - k1[1] + k1[2]);
  64. k2[3] = g(x + h, Y[0, i] + k1[0] - k1[1] + k1[2], Y[1, i] + k1[0] - k1[1] + k1[2]);
  65.  
  66. Y[0, i + 1] = Y[0, i] + (h / 8) * (k1[0] + 3 * k1[1] + 3 * k1[2] + k1[3]);
  67. Y[1, i + 1] = Y[1, i] + (h / 8) * (k2[0] + 3 * k2[1] + 3 * k2[2] + k2[3]);
  68. i++;
  69. }
  70. return Y;
  71. }
  72.  
  73. public void toTable(double a, double b, double h, double[,] Y)
  74. {
  75. dataGridView1.ColumnCount = 4;
  76. dataGridView1.RowCount = (int)((b - a) / h + 1);
  77. dataGridView1.Columns[0].HeaderText = "X";
  78. dataGridView1.Columns[1].HeaderText = "Метод стрельбы";
  79. dataGridView1.Columns[3].HeaderText = "Точное решение";
  80.  
  81.  
  82. dataGridView1_CellContentClick(a,b,h,Y);
  83. }
  84. /**
  85.   * <param name = "a"> Левая граница отрезка </param>
  86.   * <param name="b"> Правая граница отрезка </param>
  87.   * <param name="y0"> Y(a) </param>
  88.   * <param name="y1"> Y(b) </param>
  89.   * <param name="eps"> Точность </param>
  90.   * <param name="h"> Размер шага по пространству </param>
  91.   */
  92. public double[,] shooting_method(double a, double b, double y0, double y1, double h, double eps)
  93. {
  94. double nu1 = 1.0, nu2 = 0.8, nu3; // некоторое значение тангенса угла наклона касательной к решению в точке x = a
  95. int N = (int)((b - a) / h + 1); // количество элементов
  96. double[,] Y1 = new double[2, N], Y2 = new double[2, N]; // массивы для хранения решений
  97. Y1 = rk4(a, b, h, y0, nu1, Y1); // решаем систему для nu1
  98. Y2 = rk4(a, b, h, y0, nu2, Y2); // решаем систему для nu2
  99. while (Math.Abs(Y2[0, N - 1] - y1) > eps) //
  100. {
  101. nu3 = nu2 - ((nu2 - nu1) / (Y2[0, N - 1] - Y1[0, N - 1])) * (Y2[0, N - 1] - y1); // вычисляем новое nu
  102. nu1 = nu2;
  103. nu2 = nu3;
  104. Y1 = Y2;
  105. Y2 = new double[2, N]; // без этого не работает ?!? о_О
  106. Y2 = rk4(a, b, h, y0, nu2, Y2); //вычисляем решение для нового nu
  107. }
  108. return Y2;
  109. }
  110.  
  111. private void Form1_Load(object sender, EventArgs e)
  112. {
  113. double a = -1; double b = 1; // отрезок [a; b]
  114. double y0 = 0; //y(a)
  115. double y1 = 1; //y(b)
  116. double h = 0.09, eps = 0.001; // шаг и точность
  117. int N = (int)((b - a) / h + 1);
  118. double[,] Y = shooting_method(a, b, y0, y1, h, eps);
  119. toTable(a, b, h, Y);
  120. }
  121.  
  122. private void dataGridView1_CellContentClick(double a, double b, double h, double[,] Y)
  123. {
  124. int i = 0;
  125. for (double x = a; x <= b; x += h)
  126. {
  127. dataGridView1[0, i].Value = x;
  128. dataGridView1[1, i].Value = Y[0, i];
  129. dataGridView1[3, i].Value = exSolve(x);
  130. i++;
  131. }
  132. }
  133. }
  134. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cs(4,14): error CS0234: The type or namespace name `Data' does not exist in the namespace `System'. Are you missing `System.Data' assembly reference?
prog.cs(9,22): error CS0234: The type or namespace name `Forms' does not exist in the namespace `System.Windows'. Are you missing `System.Windows.Forms' assembly reference?
prog.cs(13,34): error CS0246: The type or namespace name `Form' could not be found. Are you missing an assembly reference?
Compilation failed: 3 error(s), 0 warnings
stdout
Standard output is empty