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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 31.05.2009, 16:49   #1
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
По умолчанию ошыбка в параметре з ref, наверное...

вот есть у меня реализацыя метода Рунге-Кутта для решения системи диф.уравнений 1 порядка.

и есть система:
y[1]'=F(i, x, y);
y[2]' =F(i, x, y);

вот так выглядят мои начальные условия:
(0, y[1], y[2])

n=2 в моем случае.

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication9
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        static double f(int i,
        double x,
        double[] y)
        {
            if (i == 1)
            {
                double  k1, k2;
                k1 = 0.2;
                k2 = 0.5;

                return k1*y[1]-k2*y[2]*y[1];
            }

            else if (i == 2)
            {
                double k3, k4;

                k3 = 0.4;
                k4 = 0.3;
                return -k3 * y[2] + k4 * y[1] * y[2];
            }
            else return 0;


        }/*************************************************************************
    Метод Рунге-Кутта четвертого порядка для решения
    системы дифферециальных уравнений.

    
    Алгоритм решает систему диффуров y[i]'=F(i,x,y) для i=1..n
    методом Рунге-Кутта 4 порядка.

    Начальная точка имеет кординаты (x,y[1], ..., y[n])

    До конечной точки мы добираемся через n промежуточных
    с постоянным шагом h=(x1-x)/m

    Результат помещается в переменную y
    *************************************************************************/
        public static void solvesystemrungekutta(double x,
        double x1,
        int m,
        int n,
        ref double[] y)
        {
            //double h = 0;
            int i = 0;

            for (i = 0; i <= m - 1; i++)
            {
                solvesystemrungekuttastep(x + i * (x1 - x) / m, (x1 - x) / m, n, ref y);
            }
        }
/*************************************************************************
    Один шаг метода Рунге-Кутта четвертого порядка для решения
    системы дифферециальных уравнений.

    
    Алгоритм совершает один шаг метода для системы
    диффуров y[i]'=F(i,x,y) для i=1..n

    Начальная точка имеет кординаты (x,y[1], ..., y[n])

    После выполнения алгоритма в переменной y содержится состояние
    системы в точке x+h
    *************************************************************************/

         public static void solvesystemrungekuttastep(double x,
        double h,
        int n,
        ref double[] y)
    {
        int i = 0;
        double[] yt = new double[0];
        double[] k1 = new double[0];
        double[] k2 = new double[0];
        double[] k3 = new double[0];
        double[] k4 = new double[0];

        yt = new double[n+1];
        k1 = new double[n+1];
        k2 = new double[n+1];
        k3 = new double[n+1];
        k4 = new double[n+1];
        for(i=1; i<=n; i++)
        {
            k1[i] = h*f(i, x, y);
        }
        for(i=1; i<=n; i++)
        {
            yt[i] = y[i]+0.5*k1[i];
        }
        for(i=1; i<=n; i++)
        {
            k2[i] = h*f(i, x+h*0.5, yt);
        }
        for(i=1; i<=n; i++)
        {
            yt[i] = y[i]+0.5*k2[i];
        }
        for(i=1; i<=n; i++)
        {
            k3[i] = h*f(i, x+h*0.5, yt);
        }
        for(i=1; i<=n; i++)
        {
            yt[i] = y[i]+k3[i];
        }
        for(i=1; i<=n; i++)
        {
            k4[i] = h*f(i, x+h, yt);
        }
        for(i=1; i<=n; i++)
        {
            y[i] = y[i]+(k1[i]+2.0*k2[i]+2.0*k3[i]+k4[i])/6;
        }
    }

        private void button1_Click(object sender, EventArgs e)
        {
             double[] y1;
            double[] yrez;
            y1=new double [3];

            y1[1]=20;
            y1[2]=10;
            
            solvesystemrungekutta(1, 5, 20 , 2,   ref y1);//<---------вызывает ошыбку. 
        
        }
}



    }

Последний раз редактировалось Natok; 31.05.2009 в 18:08.
Natok вне форума
Старый 31.05.2009, 17:16   #2
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
По умолчанию

ага, понятно ,вызывать надо так:

Код:
solvesystemrungekutta(1, 5, 20, 2, ref y1);
написано очень класно здесь:

http://msdn.microsoft.com/en-us/library/14akc2c7.aspx

но еще есть проблеми с индексами...выходит за границы в исчислениях
Natok вне форума
Старый 31.05.2009, 17:57   #3
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
По умолчанию

поправила, уже работает...
Natok вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос о параметре формы Алён@ Общие вопросы Delphi 4 18.04.2009 21:23
В чем ошыбка?String alexov Общие вопросы C/C++ 2 09.04.2009 19:12
Проблемы, наверное, с сессиями Gromsky PHP 3 10.03.2009 15:32
Задача (наверное на перебор) Witaliy Паскаль, Turbo Pascal, PascalABC.NET 4 18.01.2009 18:11
Функция в параметре другой функции.. templllar Помощь студентам 2 14.04.2008 14:56