Решение системы 6 уравнений методом Рунге-Кутта 4 порядка - C#
Формулировка задачи:
Подскажите пожалуйста, как переделать мою программу для решения системы 6 уравнений методом рунге кута 4 порядка? Переделать на язык С#?
Проблема в том, что я не понимаю, как в моей программе реализовать систему заданных уравнений.
dQ/dt = g/V*(N*cosj-cosQ)
dH/dt = V*sinQ
dP/dt=(-g/V*cosQ)*N*sinj
dX/dt=V*cosQ*cosP
dZ/dt=V*cosQ*sinP
g,N,j, V– задаутся с клавы
Начальные условия:
Qo , Ho,Po,Xo,Zo – задаются с клавы
Программа для другого уравнения на с++
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;
double myfunc(const double& x, const double& y)
{
return 6*x*x+5*x*y+y*y+4*x+2*y-3;
}
int main(int argc, char *argv[])
{
int i, n;
double x, y, h,py, fy,k,k0,k1,k2,k3;
cout<< " h = "; cin>>h;
cout<< " n = "; cin>>n;
cout<< " x0 = "; cin>>x;
cout<< " y0 = "; cin>>y;
for (i = 0; i <= n; i++)
{
fy = myfunc(x, y);
k0=h*fy;
k1=h*myfunc(x+h/2, y+k0/2);
k2=h*myfunc(x+h/2, y+k1/2);
k3=h*myfunc(x+h, y+k2);
k=(k0+2*k1+2*k2+k3)/6;
y += k;
cout << "y = " << y;
cout << " x = " << x << "\n";
x += h;
}
system("PAUSE");
return EXIT_SUCCESS;
}Решение задачи: «Решение системы 6 уравнений методом Рунге-Кутта 4 порядка»
textual
Листинг программы
using System;
using System.Windows.Forms;
using System.Collections.Generic;
namespace рас1
{
public partial class Form1 : Form
{
// Здесь будут храниться наши данные.
private List<MyData> list;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
list = new List<MyData>();
// Создаем связь между DataGridView, BindingSource и нашим списком.
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = bindingSource1;
bindingSource1.DataSource = list;
button1.Click += new EventHandler(button1_Click);
}
private void button1_Click(object sender, EventArgs e)
{
double h, n, t, Q, V, ny, j;
if (!double.TryParse(textBox1.Text, out h)) h = 0;
if (!double.TryParse(textBox2.Text, out n)) n = 0;
if (!double.TryParse(textBox3.Text, out t)) t = 0;
if (!double.TryParse(textBox4.Text, out Q)) Q = 0;
if (!double.TryParse(textBox5.Text, out V)) V = 0;
if (!double.TryParse(textBox6.Text, out ny)) ny = 0;
if (!double.TryParse(textBox7.Text, out j)) j = 0;
double fy, k, k0, k1, k2, k3;
for (int i = 0; i < n; i++)
{
fy = MyFunc(t, Q);
k0 = h * fy;
k1 = h * MyFunc(t + h / 2.0, Q + k0 / 2.0);
k2 = h * MyFunc(t + h / 2.0, Q + k1 / 2.0);
k3 = h * MyFunc(t + h, Q + k2);
k = (k0 + 2.0 * k1 + 2.0 * k2 + k3) / 6.0;
Q += k;
// Заносим данные в наш список.
list.Add(new MyData(t, Q));
t += h;
}
// Отображаем результат (наш список) в DataGridView
bindingSource1.ResetBindings(true);
}
// функция.
private double MyFunc(double t, double Q,double V, double ny, double j)
{
return Q = 9.81 / V * (ny * Math.Cos(j) - Math.Cos(Q));
}
private void button2_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook ObjWorkBook;
Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet;
//Книга.
ObjWorkBook = ObjExcel.Workbooks.Add(System.Reflection.Missing.Value);
//Таблица.
ObjWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ObjWorkBook.Sheets[1];
//Значения [y - строка,x - столбец]
ObjWorkSheet.Cells[2, 1] = label1.Text;
ObjWorkSheet.Cells[2, 2] = label2.Text;
ObjWorkSheet.Cells[2, 3] = label3.Text;
ObjWorkSheet.Cells[2, 4] = label4.Text;
ObjWorkSheet.Cells[3, 1] = textBox1.Text;
ObjWorkSheet.Cells[3, 2] = textBox2.Text;
ObjWorkSheet.Cells[3, 3] = textBox3.Text;
ObjWorkSheet.Cells[3, 4] = textBox4.Text;
for (int i = 0; i < list.Count; i++)
{
ObjWorkSheet.Cells[i + 3, 1] = list[i].T;
ObjWorkSheet.Cells[i + 3, 2] = list[i].Q;
}
//Вызываем нашу созданную эксельку.
ObjExcel.Visible = true;
ObjExcel.UserControl = true;
}
}
}
// Класс, в котором хранятся данные.
class MyData
{
public double T { get; set; }
public double Q { get; set; }
public MyData(double t, double Q)
{
this.T = t;
this.Q = Q;
}
}