Есть закон радиоактивного распада
С начальным условием
Задание: Нужно написать метод РК4 с контролем локальной погрешности.
Сам метод записан.В цикле вызываю его и поточечно строю в chart. Но графиком получается прямая параллельная Ох.Не могу понять где тут ошибка и как правильно нарисовать график.
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace RK4_1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
double f(double x, double u)
{
double L = double.Parse(textBox5.Text);
return (-L * x);
}
double rk4(double xn, double yn, double h)
{
double k1, k2, k3, k4, yn1;
k1 = h * f(xn, yn);
k2 = h * f(xn + 0.5 * h, yn + 0.5 * k1);
k3 = h * f(xn + 0.5 * h, yn + 0.5 * k2);
k4 = h * f(xn + h, yn + k3);
yn1 = yn + (1.0 / 6.0) * (k1 + 2.0 * k2 + 2.0 * k3 + k4);
return yn1;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
try
{
double x = double.Parse(textBox1.Text);
errorProvider1.SetError(textBox1, "");
}
catch
{
errorProvider1.SetError(textBox1, "Недопустимое значение параметра ");
}
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
try
{
double x = double.Parse(textBox2.Text);
errorProvider1.SetError(textBox2, "");
}
catch
{
errorProvider1.SetError(textBox2, "Недопустимое значение параметра ");
}
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
try
{
double x = double.Parse(textBox3.Text);
errorProvider1.SetError(textBox3, "");
}
catch
{
errorProvider1.SetError(textBox3, "Недопустимое значение параметра a ");
}
}
private void textBox4_TextChanged(object sender, EventArgs e)
{
try
{
double x = double.Parse(textBox4.Text);
errorProvider1.SetError(textBox4, "");
}
catch
{
errorProvider1.SetError(textBox4, "Недопустимое значение параметра b ");
}
}
private void textBox7_TextChanged(object sender, EventArgs e)
{
try
{
double x = double.Parse(textBox7.Text);
errorProvider1.SetError(textBox7, "");
}
catch
{
errorProvider1.SetError(textBox7, "Недопустимое значение параметра h ");
}
}
private void textBox5_TextChanged(object sender, EventArgs e)
{
try
{
double x = double.Parse(textBox5.Text);
if (x>1 || x< -1) MessageBox.Show("Значение x должно лежать в пределах [0;1]", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
errorProvider1.SetError(textBox5, "");
}
catch
{
errorProvider1.SetError(textBox5, "Недопустимое значение параметра L ");
}
}
private void button2_Click(object sender, EventArgs e)
{
double eps= double.Parse(textBox2.Text);
double x = double.Parse(textBox3.Text);//начало интервала
double u = double.Parse(textBox6.Text);
double h = double.Parse(textBox7.Text);//начальный шаг
double b = double.Parse(textBox4.Text); //конец интервала
double N = int.Parse(textBox8.Text); //число итераций
double Vi=0, V_2i=0,S=0,V=0;
chart1.Series[0].Points.Clear();
dataGridView1.Visible = true;
dataGridView1.Rows.Clear();
dataGridView1.Columns.Clear();
dataGridView1.ColumnCount = 9;
dataGridView1.Columns[0].HeaderText = "i";
dataGridView1.Columns[1].HeaderText = "h";
dataGridView1.Columns[2].HeaderText = "x";
dataGridView1.Columns[3].HeaderText = "f(x,u)";
dataGridView1.Columns[4].HeaderText = "V";
dataGridView1.Columns[5].HeaderText = "Vi";
dataGridView1.Columns[6].HeaderText = "V_2i";
dataGridView1.Columns[7].HeaderText = "S";
for (int i = 0; i < N; i++)
{
V = rk4(x,u,h);
Vi = rk4(x, u, h/2);
V_2i = rk4(x+h/2, u+h/2, h / 2);
S = (V_2i - Vi) / 15;
if ((Math.Abs(S) <= -eps) || (Math.Abs(S) >= eps))
{
h /= 2;
}
if (Math.Abs(S) < eps / Math.Pow(2,5))
{
h *= 2;
}
if ((Math.Abs(S) > eps / Math.Pow(2, 5)) && (Math.Abs(S) < eps))
{
x += h;
}
chart1.Series[0].Points.AddXY(x, rk4(x, u, h));
dataGridView1.Rows.Add();
dataGridView1.Rows[i].Cells[0].Value= i;
dataGridView1.Rows[i].Cells[1].Value = h;
dataGridView1.Rows[i].Cells[2].Value = x;
dataGridView1.Rows[i].Cells[3].Value = f(x, u);
dataGridView1.Rows[i].Cells[4].Value = V;
dataGridView1.Rows[i].Cells[5].Value = Vi;// значение c половинным шагом
dataGridView1.Rows[i].Cells[6].Value = V_2i; //половинный шаг в точке x+h/2
dataGridView1.Rows[i].Cells[7].Value = S;
x += h;
}
}
}
}