using System;
using System.Collections .Generic ;
using System.ComponentModel ;
using System.Data ;
using System.Drawing ;
using System.Linq ;
using System.Text ;
using System.Threading .Tasks ;
using System.Windows .Forms ;
namespace asdf12345zxc
{
public partial class Form1 : Form
{
double b1 = 0.3 ;
public Form1( )
{
InitializeComponent( ) ;
}
public double f( double x, double y, double z) // y' = z
{
return z;
}
public double g( double x, double y, double z)
{
return 2 * Math.Sqrt ( x) * z - x * y * ( 1 - y) ; // z' = f
}
public double exSolve( double x) // точное решение
{
return - Math.Tan ( x) ;
}
/**
* <param name = "a"> Левая граница отрезка </param>
* <param name="b"> Правая граница отрезка </param>
* <param name="h"> Шаг по пространству </param>
* <param name="y0"> Y(a) </param>
* <param name="yb"> Y(b) </param>
* <param name="Y"> Массив решений </param>
*
*/
public double [ , ] rk4( double a, double b, double h, double y0, double yb, double [ , ] Y)
{
double [ ] k1 = new double [ 4 ] ; //коэффиценты К
double [ ] k2 = new double [ 4 ] ; //коэффиценты К
int i = 0 ;
Y[ 0 , 0 ] = y0;
Y[ 1 , 0 ] = yb;
for ( double x = a; x < b - h; x += h)
{
k1[ 0 ] = f( x, Y[ 0 , i] , Y[ 1 , i] ) ;
k2[ 0 ] = g( x, Y[ 0 , i] , Y[ 1 , i] ) ;
k1[ 1 ] = f( x + h / 3 , Y[ 0 , i] + k1[ 0 ] * ( h / 3 ) , Y[ 1 , i] + k2[ 0 ] * ( h / 3 ) ) ;
k2[ 1 ] = g( x + h / 3 , Y[ 0 , i] + k1[ 0 ] * ( h / 3 ) , Y[ 1 , i] + k2[ 0 ] * ( h / 3 ) ) ;
k1[ 2 ] = f( x + h * 2 / 3 , Y[ 0 , i] - k1[ 1 ] * ( h / 3 ) , Y[ 1 , i] - k2[ 1 ] * ( h / 3 ) ) ;
k2[ 2 ] = g( x + h * 2 / 3 , Y[ 0 , i] - k1[ 1 ] * ( h / 3 ) , Y[ 1 , i] - k2[ 1 ] * ( h / 3 ) ) ;
k1[ 3 ] = f( x + h, Y[ 0 , i] + k1[ 0 ] - k1[ 1 ] + k1[ 2 ] , Y[ 1 , i] + k1[ 0 ] - k1[ 1 ] + k1[ 2 ] ) ;
k2[ 3 ] = g( x + h, Y[ 0 , i] + k1[ 0 ] - k1[ 1 ] + k1[ 2 ] , Y[ 1 , i] + k1[ 0 ] - k1[ 1 ] + k1[ 2 ] ) ;
Y[ 0 , i + 1 ] = Y[ 0 , i] + ( h / 8 ) * ( k1[ 0 ] + 3 * k1[ 1 ] + 3 * k1[ 2 ] + k1[ 3 ] ) ;
Y[ 1 , i + 1 ] = Y[ 1 , i] + ( h / 8 ) * ( k2[ 0 ] + 3 * k2[ 1 ] + 3 * k2[ 2 ] + k2[ 3 ] ) ;
i++;
}
return Y;
}
public void toTable( double a, double b, double h, double [ , ] Y)
{
dataGridView1.ColumnCount = 4 ;
dataGridView1.RowCount = ( int ) ( ( b - a) / h + 1 ) ;
dataGridView1.Columns [ 0 ] .HeaderText = "X" ;
dataGridView1.Columns [ 1 ] .HeaderText = "Метод стрельбы" ;
dataGridView1.Columns [ 3 ] .HeaderText = "Точное решение" ;
dataGridView1_CellContentClick( a, b, h, Y) ;
}
/**
* <param name = "a"> Левая граница отрезка </param>
* <param name="b"> Правая граница отрезка </param>
* <param name="y0"> Y(a) </param>
* <param name="y1"> Y(b) </param>
* <param name="eps"> Точность </param>
* <param name="h"> Размер шага по пространству </param>
*/
public double [ , ] shooting_method( double a, double b, double y0, double y1, double h, double eps)
{
double nu1 = 1.0 , nu2 = 0.8 , nu3; // некоторое значение тангенса угла наклона касательной к решению в точке x = a
int N = ( int ) ( ( b - a) / h + 1 ) ; // количество элементов
double [ , ] Y1 = new double [ 2 , N] , Y2 = new double [ 2 , N] ; // массивы для хранения решений
Y1 = rk4( a, b, h, y0, nu1, Y1) ; // решаем систему для nu1
Y2 = rk4( a, b, h, y0, nu2, Y2) ; // решаем систему для nu2
while ( Math.Abs ( Y2[ 0 , N - 1 ] - y1) > eps) //
{
nu3 = nu2 - ( ( nu2 - nu1) / ( Y2[ 0 , N - 1 ] - Y1[ 0 , N - 1 ] ) ) * ( Y2[ 0 , N - 1 ] - y1) ; // вычисляем новое nu
nu1 = nu2;
nu2 = nu3;
Y1 = Y2;
Y2 = new double [ 2 , N] ; // без этого не работает ?!? о_О
Y2 = rk4( a, b, h, y0, nu2, Y2) ; //вычисляем решение для нового nu
}
return Y2;
}
private void Form1_Load( object sender, EventArgs e)
{
double a = - 1 ; double b = 1 ; // отрезок [a; b]
double y0 = 0 ; //y(a)
double y1 = 1 ; //y(b)
double h = 0.09 , eps = 0.001 ; // шаг и точность
int N = ( int ) ( ( b - a) / h + 1 ) ;
double [ , ] Y = shooting_method( a, b, y0, y1, h, eps) ;
toTable( a, b, h, Y) ;
}
private void dataGridView1_CellContentClick( double a, double b, double h, double [ , ] Y)
{
int i = 0 ;
for ( double x = a; x <= b; x += h)
{
dataGridView1[ 0 , i] .Value = x;
dataGridView1[ 1 , i] .Value = Y[ 0 , i] ;
dataGridView1[ 3 , i] .Value = exSolve( x) ;
i++;
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkNvbXBvbmVudE1vZGVsOwp1c2luZyBTeXN0ZW0uRGF0YTsKdXNpbmcgU3lzdGVtLkRyYXdpbmc7CnVzaW5nIFN5c3RlbS5MaW5xOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgU3lzdGVtLldpbmRvd3MuRm9ybXM7CiAKbmFtZXNwYWNlIGFzZGYxMjM0NXp4Ywp7CiAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBGb3JtMSA6IEZvcm0KICAgIHsKICAgICAgICBkb3VibGUgYjEgPSAwLjM7CiAgICAgICAgcHVibGljIEZvcm0xKCkKICAgICAgICB7CiAgICAgICAgICAgIEluaXRpYWxpemVDb21wb25lbnQoKTsKICAgICAgICB9CiAKICAgICAgICBwdWJsaWMgZG91YmxlIGYoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeikgLy8geScgPSB6CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gejsKICAgICAgICB9CiAKICAgICAgICBwdWJsaWMgZG91YmxlIGcoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAyICogTWF0aC5TcXJ0KHgpICogeiAtIHggKiB5ICogKDEgLSB5KTsgLy8geicgPSBmCiAgICAgICAgfQogCiAgICAgICAgcHVibGljIGRvdWJsZSBleFNvbHZlKGRvdWJsZSB4KSAvLyDRgtC+0YfQvdC+0LUg0YDQtdGI0LXQvdC40LUKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAtTWF0aC5UYW4oeCk7CiAgICAgICAgfQogCiAgICAgICAgLyoqCiAgICAgICAgICogPHBhcmFtIG5hbWUgPSAiYSI+INCb0LXQstCw0Y8g0LPRgNCw0L3QuNGG0LAg0L7RgtGA0LXQt9C60LAgPC9wYXJhbT4KICAgICAgICAgKiA8cGFyYW0gbmFtZT0iYiI+INCf0YDQsNCy0LDRjyDQs9GA0LDQvdC40YbQsCDQvtGC0YDQtdC30LrQsCA8L3BhcmFtPgogICAgICAgICAqIDxwYXJhbSBuYW1lPSJoIj4g0KjQsNCzINC/0L4g0L/RgNC+0YHRgtGA0LDQvdGB0YLQstGDIDwvcGFyYW0+CiAgICAgICAgICogPHBhcmFtIG5hbWU9InkwIj4gWShhKSA8L3BhcmFtPgogICAgICAgICAqIDxwYXJhbSBuYW1lPSJ5YiI+IFkoYikgPC9wYXJhbT4KICAgICAgICAgKiA8cGFyYW0gbmFtZT0iWSI+INCc0LDRgdGB0LjQsiDRgNC10YjQtdC90LjQuSA8L3BhcmFtPgogICAgICAgICAqIAogICAgICAgICAqLwogICAgICAgIHB1YmxpYyBkb3VibGVbLF0gcms0KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGgsIGRvdWJsZSB5MCwgZG91YmxlIHliLCBkb3VibGVbLF0gWSkKICAgICAgICB7CiAgICAgICAgICAgIGRvdWJsZVtdIGsxID0gbmV3IGRvdWJsZVs0XTsgLy/QutC+0Y3RhNGE0LjRhtC10L3RgtGLINCaCiAgICAgICAgICAgIGRvdWJsZVtdIGsyID0gbmV3IGRvdWJsZVs0XTsgLy/QutC+0Y3RhNGE0LjRhtC10L3RgtGLINCaCiAgICAgICAgICAgIGludCBpID0gMDsKICAgICAgICAgICAgWVswLCAwXSA9IHkwOwogICAgICAgICAgICBZWzEsIDBdID0geWI7CiAgICAgICAgICAgIGZvciAoZG91YmxlIHggPSBhOyB4IDwgYiAtIGg7IHggKz0gaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgazFbMF0gPSBmKHgsIFlbMCwgaV0sIFlbMSwgaV0pOwogICAgICAgICAgICAgICAgazJbMF0gPSBnKHgsIFlbMCwgaV0sIFlbMSwgaV0pOwogCiAgICAgICAgICAgICAgICBrMVsxXSA9IGYoeCArIGggLyAzLCBZWzAsIGldICsgazFbMF0gKiAoaCAvIDMpLCBZWzEsIGldICsgazJbMF0gKiAoaCAvIDMpKTsKICAgICAgICAgICAgICAgIGsyWzFdID0gZyh4ICsgaCAvIDMsIFlbMCwgaV0gKyBrMVswXSAqIChoIC8gMyksIFlbMSwgaV0gKyBrMlswXSAqIChoIC8gMykpOwogCiAgICAgICAgICAgICAgICBrMVsyXSA9IGYoeCArIGggKiAyIC8gMywgWVswLCBpXSAtIGsxWzFdICogKGggLyAzKSwgWVsxLCBpXSAtIGsyWzFdICogKGggLyAzKSk7CiAgICAgICAgICAgICAgICBrMlsyXSA9IGcoeCArIGggKiAyIC8gMywgWVswLCBpXSAtIGsxWzFdICogKGggLyAzKSwgWVsxLCBpXSAtIGsyWzFdICogKGggLyAzKSk7CiAKICAgICAgICAgICAgICAgIGsxWzNdID0gZih4ICsgaCwgWVswLCBpXSArIGsxWzBdIC0gazFbMV0gKyBrMVsyXSwgWVsxLCBpXSArIGsxWzBdIC0gazFbMV0gKyBrMVsyXSk7CiAgICAgICAgICAgICAgICBrMlszXSA9IGcoeCArIGgsIFlbMCwgaV0gKyBrMVswXSAtIGsxWzFdICsgazFbMl0sIFlbMSwgaV0gKyBrMVswXSAtIGsxWzFdICsgazFbMl0pOwogCiAgICAgICAgICAgICAgICBZWzAsIGkgKyAxXSA9IFlbMCwgaV0gKyAoaCAvIDgpICogKGsxWzBdICsgMyAqIGsxWzFdICsgMyAqIGsxWzJdICsgazFbM10pOwogICAgICAgICAgICAgICAgWVsxLCBpICsgMV0gPSBZWzEsIGldICsgKGggLyA4KSAqIChrMlswXSArIDMgKiBrMlsxXSArIDMgKiBrMlsyXSArIGsyWzNdKTsKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gWTsKICAgICAgICB9CiAKICAgICAgICBwdWJsaWMgdm9pZCB0b1RhYmxlKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGgsIGRvdWJsZVssXSBZKQogICAgICAgIHsKICAgICAgICAgICAgZGF0YUdyaWRWaWV3MS5Db2x1bW5Db3VudCA9IDQ7CiAgICAgICAgICAgIGRhdGFHcmlkVmlldzEuUm93Q291bnQgPSAoaW50KSgoYiAtIGEpIC8gaCArIDEpOwogICAgICAgICAgICBkYXRhR3JpZFZpZXcxLkNvbHVtbnNbMF0uSGVhZGVyVGV4dCA9ICJYIjsKICAgICAgICAgICAgZGF0YUdyaWRWaWV3MS5Db2x1bW5zWzFdLkhlYWRlclRleHQgPSAi0JzQtdGC0L7QtCDRgdGC0YDQtdC70YzQsdGLIjsKICAgICAgICAgICAgZGF0YUdyaWRWaWV3MS5Db2x1bW5zWzNdLkhlYWRlclRleHQgPSAi0KLQvtGH0L3QvtC1INGA0LXRiNC10L3QuNC1IjsKIAogICAgICAgICAgICAKICAgICAgICAgICAgZGF0YUdyaWRWaWV3MV9DZWxsQ29udGVudENsaWNrKGEsYixoLFkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiA8cGFyYW0gbmFtZSA9ICJhIj4g0JvQtdCy0LDRjyDQs9GA0LDQvdC40YbQsCDQvtGC0YDQtdC30LrQsCA8L3BhcmFtPgogICAgICAgICAqIDxwYXJhbSBuYW1lPSJiIj4g0J/RgNCw0LLQsNGPINCz0YDQsNC90LjRhtCwINC+0YLRgNC10LfQutCwIDwvcGFyYW0+CiAgICAgICAgICogPHBhcmFtIG5hbWU9InkwIj4gWShhKSA8L3BhcmFtPgogICAgICAgICAqIDxwYXJhbSBuYW1lPSJ5MSI+IFkoYikgPC9wYXJhbT4KICAgICAgICAgKiA8cGFyYW0gbmFtZT0iZXBzIj4g0KLQvtGH0L3QvtGB0YLRjCA8L3BhcmFtPgogICAgICAgICAqIDxwYXJhbSBuYW1lPSJoIj4g0KDQsNC30LzQtdGAINGI0LDQs9CwINC/0L4g0L/RgNC+0YHRgtGA0LDQvdGB0YLQstGDIDwvcGFyYW0+CiAgICAgICAgICovCiAgICAgICAgcHVibGljIGRvdWJsZVssXSBzaG9vdGluZ19tZXRob2QoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgeTAsIGRvdWJsZSB5MSwgZG91YmxlIGgsIGRvdWJsZSBlcHMpCiAgICAgICAgewogICAgICAgICAgICBkb3VibGUgbnUxID0gMS4wLCBudTIgPSAwLjgsIG51MzsgLy8g0L3QtdC60L7RgtC+0YDQvtC1INC30L3QsNGH0LXQvdC40LUg0YLQsNC90LPQtdC90YHQsCDRg9Cz0LvQsCDQvdCw0LrQu9C+0L3QsCDQutCw0YHQsNGC0LXQu9GM0L3QvtC5INC6INGA0LXRiNC10L3QuNGOINCyINGC0L7Rh9C60LUgeCA9IGEKICAgICAgICAgICAgaW50IE4gPSAoaW50KSgoYiAtIGEpIC8gaCArIDEpOyAvLyDQutC+0LvQuNGH0LXRgdGC0LLQviDRjdC70LXQvNC10L3RgtC+0LIKICAgICAgICAgICAgZG91YmxlWyxdIFkxID0gbmV3IGRvdWJsZVsyLCBOXSwgWTIgPSBuZXcgZG91YmxlWzIsIE5dOyAvLyDQvNCw0YHRgdC40LLRiyDQtNC70Y8g0YXRgNCw0L3QtdC90LjRjyDRgNC10YjQtdC90LjQuQogICAgICAgICAgICBZMSA9IHJrNChhLCBiLCBoLCB5MCwgbnUxLCBZMSk7IC8vINGA0LXRiNCw0LXQvCDRgdC40YHRgtC10LzRgyDQtNC70Y8gbnUxCiAgICAgICAgICAgIFkyID0gcms0KGEsIGIsIGgsIHkwLCBudTIsIFkyKTsgLy8g0YDQtdGI0LDQtdC8INGB0LjRgdGC0LXQvNGDINC00LvRjyBudTIKICAgICAgICAgICAgd2hpbGUgKE1hdGguQWJzKFkyWzAsIE4gLSAxXSAtIHkxKSA+IGVwcykgLy8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbnUzID0gbnUyIC0gKChudTIgLSBudTEpIC8gKFkyWzAsIE4gLSAxXSAtIFkxWzAsIE4gLSAxXSkpICogKFkyWzAsIE4gLSAxXSAtIHkxKTsgLy8g0LLRi9GH0LjRgdC70Y/QtdC8INC90L7QstC+0LUgbnUKICAgICAgICAgICAgICAgIG51MSA9IG51MjsKICAgICAgICAgICAgICAgIG51MiA9IG51MzsKICAgICAgICAgICAgICAgIFkxID0gWTI7CiAgICAgICAgICAgICAgICBZMiA9IG5ldyBkb3VibGVbMiwgTl07IC8vINCx0LXQtyDRjdGC0L7Qs9C+INC90LUg0YDQsNCx0L7RgtCw0LXRgiA/IT8g0L5f0J4KICAgICAgICAgICAgICAgIFkyID0gcms0KGEsIGIsIGgsIHkwLCBudTIsIFkyKTsgLy/QstGL0YfQuNGB0LvRj9C10Lwg0YDQtdGI0LXQvdC40LUg0LTQu9GPINC90L7QstC+0LPQviBudQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBZMjsKICAgICAgICB9CiAKICAgICAgICBwcml2YXRlIHZvaWQgRm9ybTFfTG9hZChvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkKICAgICAgICB7CiAgICAgICAgICAgIGRvdWJsZSBhID0gLTE7IGRvdWJsZSBiID0gMTsgLy8g0L7RgtGA0LXQt9C+0LogW2E7IGJdIAogICAgICAgICAgICBkb3VibGUgeTAgPSAwOyAvL3koYSkKICAgICAgICAgICAgZG91YmxlIHkxID0gMTsgLy95KGIpCiAgICAgICAgICAgIGRvdWJsZSBoID0gMC4wOSwgZXBzID0gMC4wMDE7IC8vINGI0LDQsyDQuCDRgtC+0YfQvdC+0YHRgtGMCiAgICAgICAgICAgIGludCBOID0gKGludCkoKGIgLSBhKSAvIGggKyAxKTsKICAgICAgICAgICAgZG91YmxlWyxdIFkgPSBzaG9vdGluZ19tZXRob2QoYSwgYiwgeTAsIHkxLCBoLCBlcHMpOwogICAgICAgICAgICB0b1RhYmxlKGEsIGIsIGgsIFkpOwogICAgICAgIH0KIAogICAgICAgIHByaXZhdGUgdm9pZCBkYXRhR3JpZFZpZXcxX0NlbGxDb250ZW50Q2xpY2soZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgaCwgZG91YmxlWyxdIFkpCiAgICAgICAgewogICAgICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgICAgIGZvciAoZG91YmxlIHggPSBhOyB4IDw9IGI7IHggKz0gaCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGF0YUdyaWRWaWV3MVswLCBpXS5WYWx1ZSA9IHg7CiAgICAgICAgICAgICAgICBkYXRhR3JpZFZpZXcxWzEsIGldLlZhbHVlID0gWVswLCBpXTsKICAgICAgICAgICAgICAgIGRhdGFHcmlkVmlldzFbMywgaV0uVmFsdWUgPSBleFNvbHZlKHgpOwogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9