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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2019, 12:08   #1
Rilpack
Пользователь
 
Регистрация: 14.05.2019
Сообщений: 25
По умолчанию Метод Гаусса

Ошибка в 102 строке, не знаю, как решить, весь инет облазил.
Это часть самого приложения с классами. Думаю, что неправильно создал классы, но не знаю, как исправить
Код:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
 
namespace Project
{
    public partial class Form1 : Form
    {
        // Массив коэффициентов
        List<List<double>> coeffs;
        // Массив свободных членов
        List<double> svoc;
        // Массив значений X
        List<double> otvets;
 
        // Инициализировация формы
        public Form1()
        {
            InitializeComponent();
        }
 
        // Изменить порядок уравнений местами
        public class PE : Form1
        {
        public int k, num;
        public void Per(int k, int num)
        {
            double z = this.coeffs[k][k];
            int i = k;
 
            // Пробегаемся по еще не просмотренным уравнениям
            for (int j = k + 1; j < num; j++)
            {
                // Если коэффициент меньше текущего
                if (Math.Abs(this.coeffs[j][k]) > z)
                {
                    // Запомним это
                    z = this.coeffs[j][k];
                    i = j;
                }
            }
 
            // Если мы нашли уравнение с которым нужно поменять текущее
            if (i > k)
            {
                // То пробегаемся по коэффициентам и меняем их местами
                for (int j = k; j < num; j++)
                {
                    z = this.coeffs[i][j];
                    this.coeffs[i][j] = this.coeffs[k][j];
                    this.coeffs[k][j] = z;
                }
 
                // Свободные члены тоже меняем
                z = this.svoc[i];
                this.svoc[i] = this.svoc[k];
                svoc[k] = z;
            }
        }
    }
 
        // Обратный ход метода Гаусса
        public class OBRATNIY : Form1
        {
            private int num;
            public void OBR(int num)
            {
                // Пробегаемся по уравнениям обратно
                for (int k = num - 1; k >= 0; k--)
                {
                    double r = 0;
                    // Вычисляем, насколько нужно изменить свободный член
                    for (int j = k + 1; j < num; j++)
                    {
                        double g = this.coeffs[k][j] * this.otvets[j];
                        r = r + g;
                    }
 
                    // Если получили ноль, то ответ - ноль
                    if (this.coeffs[k][k] == 0)
                    {
                        this.otvets[k] = 0;
                    }
                    else
                    // В противном случае вычислим значение конкретного X
                    {
                        this.otvets[k] = (this.svoc[k] - r) / this.coeffs[k][k];
                    }
                }
            }
        }
 
        // Прямой ход метода Гаусса
        public class P : PE
        {
            public void PR(int num)
            {
                // Пробегаем по всем уравнениям
                for (int k = 0; k < num; k++)
                {
                    // Если коэффициент равен нулю, поменяем уравнение с каким-либо другим
                    if (this.coeffs[k][k] == 0)
                    {
                        Per(k, num);
                    }
 
                    double r;
                    // Для всех уравнений за нашим
                    for (int j = k + 1; j < num; j++)
                    {
                        // Если коэффициент уже ноль, ничего не делаем
                        if (this.coeffs[k][k] == 0)
                        {
                            r = 0;
                        }
                        // Если не ноль, вычисляем, как сделать его нулем
                        else
                        {
                            r = this.coeffs[j][k] / this.coeffs[k][k];
                        }
 
                        // Пересчитываем каждый коэффициент уравнения после k-того
                        for (int i = k; i < num; i++)
                        {
                            this.coeffs[j][i] = this.coeffs[j][i] - r * this.coeffs[k][i];
                        }
                        // Пересчитываем свободный член
                        this.svoc[j] = this.svoc[j] - r * this.svoc[k];
                    }
                }
            }
        }
Rilpack вне форума Ответить с цитированием
Старый 30.12.2019, 14:11   #2
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Код:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
 
namespace Project
{
    public partial class Form1 : Form
    {
        // Массив коэффициентов
        List<List<double>> coeffs;
        // Массив свободных членов
        List<double> svoc;
        // Массив значений X
        List<double> otvets;
 
        // Инициализировация формы
        public Form1()
        {
            InitializeComponent();
        }
 
        // Изменить порядок уравнений местами
        public class PE : Form1
        {
        public int k, num;
        public void Per(int k, int num)
        {
            double z = this.coeffs[k][k];
            int i = k;
 
            // Пробегаемся по еще не просмотренным уравнениям
            for (int j = k + 1; j < num; j++)
            {
                // Если коэффициент меньше текущего
                if (Math.Abs(this.coeffs[j][k]) > z)
                {
                    // Запомним это
                    z = this.coeffs[j][k];
                    i = j;
                }
            }
 
            // Если мы нашли уравнение с которым нужно поменять текущее
            if (i > k)
            {
                // То пробегаемся по коэффициентам и меняем их местами
                for (int j = k; j < num; j++)
                {
                    z = this.coeffs[i][j];
                    this.coeffs[i][j] = this.coeffs[k][j];
                    this.coeffs[k][j] = z;
                }
 
                // Свободные члены тоже меняем
                z = this.svoc[i];
                this.svoc[i] = this.svoc[k];
                svoc[k] = z;
            }
        }
    }
 
        // Обратный ход метода Гаусса
        public class OBRATNIY : Form1
        {
            private int num;
            public void OBR(int num)
            {
                // Пробегаемся по уравнениям обратно
                for (int k = num - 1; k >= 0; k--)
                {
                    double r = 0;
                    // Вычисляем, насколько нужно изменить свободный член
                    for (int j = k + 1; j < num; j++)
                    {
                        double g = this.coeffs[k][j] * this.otvets[j];
                        r = r + g;
                    }
 
                    // Если получили ноль, то ответ - ноль
                    if (this.coeffs[k][k] == 0)
                    {
                        this.otvets[k] = 0;
                    }
                    else
                    // В противном случае вычислим значение конкретного X
                    {
                        this.otvets[k] = (this.svoc[k] - r) / this.coeffs[k][k];
                    }
                }
            }
        }
 
        // Прямой ход метода Гаусса
        public class P : PE
        {
            public void PR(int num)
            {
                // Пробегаем по всем уравнениям
                for (int k = 0; k < num; k++)
                {
                    // Если коэффициент равен нулю, поменяем уравнение с каким-либо другим
                    if (this.coeffs[k][k] == 0)
                    {
                        Per(k, num);
                    }
 
                    double r;
                    // Для всех уравнений за нашим
                    for (int j = k + 1; j < num; j++)
                    {
                        // Если коэффициент уже ноль, ничего не делаем
                        if (this.coeffs[k][k] == 0)
                        {
                            r = 0;
                        }
                        // Если не ноль, вычисляем, как сделать его нулем
                        else
                        {
                            r = this.coeffs[j][k] / this.coeffs[k][k];
                        }
 
                        // Пересчитываем каждый коэффициент уравнения после k-того
                        for (int i = k; i < num; i++)
                        {
                            this.coeffs[j][i] = this.coeffs[j][i] - r * this.coeffs[k][i];
                        }
                        // Пересчитываем свободный член
                        this.svoc[j] = this.svoc[j] - r * this.svoc[k];
                    }
                }
            }
        }
	}
}
А так?
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод гаусса. ironhide8 Помощь студентам 4 30.05.2014 06:33
Метод Гаусса Symple me Общие вопросы C/C++ 2 14.10.2012 10:31
метод простых операций и метод гаусса зейделя tarasman11 Паскаль, Turbo Pascal, PascalABC.NET 1 23.09.2012 14:46
Безумно сложные задачки!!!! Метод Гаусса, итераций, метод половинного деления, задача Коши и т.д. Хомяк!!!!! Помощь студентам 4 08.07.2009 10:08
Help!!! Метод Гаусса Надя Microsoft Office Excel 7 07.05.2008 00:45