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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2016, 05:20   #1
ТипичныйСтудент
Форумчанин
 
Аватар для ТипичныйСтудент
 
Регистрация: 09.04.2013
Сообщений: 110
По умолчанию c# Нахождение корней полинома методом простой итерации

Доброго времени суток! Слёзно прошу помощи
Задача:
Оформить задание как Windows приложение. Построить интерфейс пользователя, позволяющий ему находить корни полинома. В основу поиска положить метод простой итерации. Предусмотреть ввод данных пользователем. Предусмотреть автоматический ввод случайных данных.
Решение:
Код:
private void numericUpDown1_Click(object sender, EventArgs e)//кол-во коэффициентов
        {
            dataGridView1.Rows.Clear();

            for (int i = 0; i <= numericUpDown1.Value-1; i++) 
                dataGridView1.Rows.Add("C"+i, "");
        }
Код:
        private void button2_Click(object sender, EventArgs e) // заполнить значения коэффициентов
        {
            dataGridView1.Rows.Clear();

            for (int i = 0; i <= numericUpDown1.Value - 1; i++)
                dataGridView1.Rows.Add("C" + i, rnd.Next(-10,10));
        }
Код:
        private void button1_Click(object sender, EventArgs e) //нахождение корней
        {   
            double epsilon = 0.00001;      //погрешность
            double xNew = 0; //новое значение функции
            double xOld = 0; //предыдущее значение функции
        
            double X  = 0; //приближенное значение корня
            double P  = 0; //полином
            dataGridView2.Rows.Clear();

            var iter = 0; //число итераций
            do
            {
                for (int i = 0; i <= numericUpDown1.Value - 1; i++)
                    P = P + Convert.ToDouble(dataGridView1.Rows[i].Cells[1].Value) * Math.Pow(X, i); //полином

                xNew = xNew - P; //Пусть x0 – некоторое заданное начальное приближение к корню полинома. 
                                 //Тогда можно построить следующий итерационный процесс:
                                 //X(k)=X(k-1)-F(k-1); где k=1,2,3...


                if (Math.Abs(xOld - xNew) <= epsilon || iter == 1000)
                    break;

                xOld = xNew;
                iter++;
            }
            while (true);
            {
                dataGridView2.Rows.Add(iter, xOld);
            }
        }
Код не работает. Читала про метод простых итераций, делала по аналогии, для простого уравнения типа F(X)=3/(X+5) считает, как обработать полином - ума не приложу. Приведенный выше вариант результата моих мучений.
Подскажите пожалуйста, как правильно это исправить?
Есть задача - реши ее!

Последний раз редактировалось ТипичныйСтудент; 06.07.2016 в 11:10.
ТипичныйСтудент вне форума Ответить с цитированием
Старый 06.07.2016, 05:25   #2
ТипичныйСтудент
Форумчанин
 
Аватар для ТипичныйСтудент
 
Регистрация: 09.04.2013
Сообщений: 110
По умолчанию

Немного изменила, добавила очищение полинома:
Код:
 private void button1_Click(object sender, EventArgs e) //нахождение корней
        {   
            double epsilon = 0.00001;      //погрешность
            double xNew = 0; //новое значение функции
            double xOld = 0; //предыдущее значение функции
        
            double X  = 0; //приближенное значение корня
            double P  = 0; //полином
            dataGridView2.Rows.Clear();

            var iter = 0; //число итераций
            do
            {
                for (int i = 0; i <= numericUpDown1.Value - 1; i++)
                    P = P + Convert.ToDouble(dataGridView1.Rows[i].Cells[1].Value) * Math.Pow(X, i); //полином

                xNew = xNew - P; //Пусть x0 – некоторое заданное начальное приближение к корню полинома. 
                                 //Тогда можно построить следующий итерационный процесс:
                                 //X(k)=X(k-1)-F(k-1); где k=1,2,3...


                if (Math.Abs(xOld - xNew) <= epsilon || iter == 1000)
                    break;

                xOld = xNew;
                P = 0;
                iter++;
            }
            while (true);
            {
                dataGridView2.Rows.Add(iter, xOld);
            }
        }
Проблема не решилась)
=((((
Есть задача - реши ее!

Последний раз редактировалось ТипичныйСтудент; 06.07.2016 в 05:33.
ТипичныйСтудент вне форума Ответить с цитированием
Старый 06.07.2016, 07:46   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Отладка в уме говорит о том, что вот тут
Код:
for (int i = 0; i <= numericUpDown1.Value - 1; i++)
    P = P + Convert.ToDouble(dataGridView1.Rows[i].Cells[1].Value) * Math.Pow(X, i);
всегда получается 0, т.к. Х изначально 0. Поэтому нет никаких итераций, цикл сразу заканчивается, т.к. Холд==Хнью.
Может стоит попробовать задать начальный Х другим, например, 10 ? Там уже смотреть неточности реализации самого метода, если будут проблемы.

За темой послежу, но времени сейчас мало, ничего не обещаю.
phomm вне форума Ответить с цитированием
Старый 06.07.2016, 11:07   #4
ТипичныйСтудент
Форумчанин
 
Аватар для ТипичныйСтудент
 
Регистрация: 09.04.2013
Сообщений: 110
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Отладка в уме говорит о том, что вот тут
Код:
for (int i = 0; i <= numericUpDown1.Value - 1; i++)
    P = P + Convert.ToDouble(dataGridView1.Rows[i].Cells[1].Value) * Math.Pow(X, i);
всегда получается 0, т.к. Х изначально 0. Поэтому нет никаких итераций, цикл сразу заканчивается, т.к. Холд==Хнью.
Может стоит попробовать задать начальный Х другим, например, 10 ? Там уже смотреть неточности реализации самого метода, если будут проблемы.

За темой послежу, но времени сейчас мало, ничего не обещаю.
Не совсем так, здесь этот цикл по коэффициентам С0....Сi, мы изначально задаем сколько у нас коэффициентов (соответственно и максимальную степень), согласно этому количеству создается столько же строк в гриде, затем либо руками либо рандомно заполняем значения этих С, затем формируем полином.
Т.е. здесь i=0 - индекс коэффициента, и брать его равным 10 нельзя(

Ну а если изменить вот тут:
Код:
 double epsilon = 0.00001;      //погрешность
            double xNew = 0; //новое значение функции
            double xOld = 0; //предыдущее значение функции
        
            double X  = 10; //приближенное значение корня
            double P  = 0; //полином
            dataGridView2.Rows.Clear();
то вот тут
Код:
 for (int i = 0; i <= numericUpDown1.Value - 1; i++)
                    P = P + Convert.ToDouble(dataGridView1.Rows[i].Cells[1].Value) * Math.Pow(X, i); //полином
вместо Х будет подставляться 10, но проблему это вообще не решает(((((
Есть задача - реши ее!
ТипичныйСтудент вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отделения корней аналитически и уточнения одного из них методом итерации/ Turbo Pascal Настена95 Помощь студентам 0 14.06.2014 13:30
"Решение системы линейных алгебраических уравнений методом простой итерации" и "Решение нелинейного уравнения методом итерации" BORODA77 Помощь студентам 0 19.03.2014 17:31
Решение СЛАУ методом простой итерации. Fialka2012 Паскаль, Turbo Pascal, PascalABC.NET 0 16.11.2012 23:16
СЛАУ методом Якоби (простой итерации) C++ Defiler Помощь студентам 0 14.05.2012 18:24
Решение нелинейных уравнений методом хорд и методом простой итерации(С++) Foralberg Помощь студентам 9 31.01.2011 01:33