Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2018, 13:38   #1
AnkaCrash
 
Регистрация: 17.06.2018
Сообщений: 4
По умолчанию метод Рунге-Кутты 4 порядка

Всем привет!

Есть задача - решить систему второго порядка методом Рунге-Кутты 4 порядка, и построить график.

Программу, которая решает мою систему, я написала. А вот как построить график, туплю Вспомнила только, как координатные оси нарисовать. Помогите плз

Вот код:
Код:
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 WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        double x, y, M, f, g, k1, k2, k3, k4, l1, l2, l3, l4;
        double h = 0.01;

        double Function_f(double a, double b)
        {
            return f = M * a - b - a * (Math.Pow(a, 2) + Math.Pow(b, 2));
        }
        
        double Function_g(double a, double b)
        {
            return g = a + M * b - b * (Math.Pow(a, 2) + Math.Pow(b, 2));
        }
        
        void button1_Click(object sender, EventArgs e)
        {
            Graphics g = pictureBox1.CreateGraphics();
            Pen pen1 = new Pen(Color.ForestGreen, 2);
            Pen pen2 = new Pen(Color.Red, 1);
            Pen pen3 = new Pen(Color.Green, 1);

            Point y1 = new Point(pictureBox1.Width / 2, 0);
            Point y2 = new Point(pictureBox1.Width / 2, pictureBox1.Height);
            g.DrawLine(pen1, y1, y2);

            Point x1 = new Point(0, pictureBox1.Height / 2);
            Point x2 = new Point(pictureBox1.Width, pictureBox1.Height / 2);
            g.DrawLine(pen1, x1, x2);
            
            try
            {
                textBox4.Text = null;
                textBox5.Text = null;

                M = Convert.ToDouble(textBox1.Text);
                x = Convert.ToDouble(textBox2.Text);
                y = Convert.ToDouble(textBox3.Text);

                for (int i = 0; i < 10; i++)
                {
                    k1 = h * Function_f(x, y);
                    l1 = h * Function_g(x, y);
                    k2 = h * Function_f(x + k1 / 2, y + l1 / 2);
                    l2 = h * Function_g(x + k1 / 2, y + l1 / 2);
                    k3 = h * Function_f(x + k2 / 2, y + l2 / 2);
                    l3 = h * Function_g(x + k2 / 2, y + l2 / 2);
                    k4 = h * Function_f(x + k3 / 2, y + l3 / 2);
                    l4 = h * Function_g(x + k3 / 2, y + l3 / 2);

                    double fRez = (Function_f(x, y));
                    double gRez = (Function_g(x, y));

                    textBox4.Text += Convert.ToString(fRez + "\n");
                    textBox5.Text += Convert.ToString(gRez + "\n");

                    x += 1 / 6.0 * (k1 + 2 * k2 + 2 * k3 + k4);
                    y += 1 / 6.0 * (l1 + 2 * l2 + 2 * l3 + l4);
                 }


            }

            catch
            {
                label7.Text = "Введённое значение не является числом!";
            }
        }

    }
}
AnkaCrash вне форума Ответить с цитированием
Старый 17.06.2018, 16:42   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от AnkaCrash Посмотреть сообщение
А вот как построить график, туплю Вспомнила только, как координатные оси нарисовать. Помогите плз
А чем принципиально отдичается рисованией осей по двум точкам от построения вашего графиками по набору точек (xi, yi) ?
p51x вне форума Ответить с цитированием
Старый 24.06.2018, 12:46   #3
AnkaCrash
 
Регистрация: 17.06.2018
Сообщений: 4
По умолчанию

нет, за меня решать не надо, спасибо)
отличие вот в чём (для меня):
1) не уверена, можно ли в picturebox задавать координаты нецелыми числами? кажется, что да, но у меня не получилось
2) мне нужно, чтобы на графике был отражен каждый шаг цикла. в перспективе там будет for (i=0; i<1000; i++), т.е. на графике должна быть тысяча точек. есть ли смысл отрисовывать линию между токами на каждый шаг, или лучше загнать их все в массив Points, а потом нарисовать?
AnkaCrash вне форума Ответить с цитированием
Старый 24.06.2018, 13:11   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Зачем вам нецелые числа? Вы носом в монитором уперлись, что вам целых пикселей мало?

Проще всего взять библиотеку типа ZedGraph, или вроде в винформс есть стандартный Chart.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.06.2018, 13:12   #5
AnkaCrash
 
Регистрация: 17.06.2018
Сообщений: 4
По умолчанию

ок, попробую. а со вторым вопросом как?
AnkaCrash вне форума Ответить с цитированием
Старый 26.06.2018, 22:52   #6
AnkaCrash
 
Регистрация: 17.06.2018
Сообщений: 4
По умолчанию

Цитата:
using System;
using System.Drawing;
using System.Windows.Forms;


namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

double x, y, M, f, g, k1, k2, k3, k4, l1, l2, l3, l4;
double h = 0.01;

double Function_f(double a, double b)
{
return f = M * a - b - a * (Math.Pow(a, 2) + Math.Pow(b, 2));
}

double Function_g(double a, double b)
{
return g = a + M * b - b * (Math.Pow(a, 2) + Math.Pow(b, 2));
}


void button1_Click(object sender, EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
Pen pen1 = new Pen(Color.ForestGreen, 2);
Pen pen2 = new Pen(Color.Red, 1);
Pen pen3 = new Pen(Color.Green, 1);

Point y1 = new Point(pictureBox1.Width / 2, 0);
Point y2 = new Point(pictureBox1.Width / 2, pictureBox1.Height);
g.DrawLine(pen1, y1, y2);

Point x1 = new Point(0, pictureBox1.Height / 2);
Point x2 = new Point(pictureBox1.Width, pictureBox1.Height / 2);
g.DrawLine(pen1, x1, x2);

PointF[] Points = new PointF[10];

try
{
textBox4.Text = null;
textBox5.Text = null;

M = Convert.ToDouble(textBox1.Text);
x = Convert.ToDouble(textBox2.Text);
y = Convert.ToDouble(textBox3.Text);

for (int j = 0; j < 10; j++)
{
k1 = h * Function_f(x, y);
l1 = h * Function_g(x, y);
k2 = h * Function_f(x + k1 / 2, y + l1 / 2);
l2 = h * Function_g(x + k1 / 2, y + l1 / 2);
k3 = h * Function_f(x + k2 / 2, y + l2 / 2);
l3 = h * Function_g(x + k2 / 2, y + l2 / 2);
k4 = h * Function_f(x + k3 / 2, y + l3 / 2);
l4 = h * Function_g(x + k3 / 2, y + l3 / 2);

double fRez = (Function_f(x, y));
double gRez = (Function_g(x, y));

textBox4.Text += Convert.ToString(fRez + "\n");
textBox5.Text += Convert.ToString(gRez + "\n");

x += 1 / 6.0 * (k1 + 2 * k2 + 2 * k3 + k4);
y += 1 / 6.0 * (l1 + 2 * l2 + 2 * l3 + l4);

Points[j].X = (float)fRez;
Points[j].Y = (float)gRez;

}
g.DrawLines(pen2, Points);

}

catch
{
label7.Text = "Введённое значение не является числом!";
}
}

}
}

Насколько я понимаю, оформляется примерно так. Но всё-таки ничего не рисует. Где я ошибсо? Хелп
AnkaCrash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C#/C++ Численные методы(Метод Рунге-Кутты 3-го порядка) inerc Фриланс 0 12.01.2016 02:08
Метод Рунге-Кутты 4го порядка Pascal sam999999 Паскаль, Turbo Pascal, PascalABC.NET 0 27.03.2013 17:24
Метод рунге-кутты 4 порядка riko782 Помощь студентам 0 14.05.2012 22:38
Метод Рунге-Кутты smbd2011 Общие вопросы C/C++ 5 16.09.2011 23:14
Метод Рунге-Кутты smbd2011 Помощь студентам 0 16.09.2011 20:43