Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Логика решения уравнения простой итерацией 
:(
    Опции темы
FasterHarder
Дата 11.8.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Всем программистам привет! Respect! В общем столкнулся с решением уравнения методом простой итерации: решить уравнение Х=Фи(Х). Очередное приближение корня находится по формуле Хn = Фи(Хn-1); начальное приближение Хо задается произвольно. Метод сходится если Фи штрих(Х) по модулю менее 1.  Стал рыскать в инете нашел кучу инфы(про методы Якоби, Кунге), но конкретно как бы и ничего. Разбираться с производными некогда(уже этого почти не помню), может кто нибудь делал ранее подобное, то выложите код или подскажите схему реализации. Реализую сам, т к это элементарно, главное понять логику. Подскажите как быть то?
PM MAIL   Вверх
anonym
Дата 11.8.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 27.11.2006

Репутация: 3
Всего: 3



В данном случае достаточно написать
Код

x = x0;
for (int i = 0; i < 1000; i++)
{
    x = f(x);
}

Тогда ответом будет x.
А производные даны для того, чтоб решающий знал, что если в какой-то точке производная больше единицы, то такой метод не подходит.

Это сообщение отредактировал(а) anonym - 11.8.2007, 17:37
PM MAIL   Вверх
FasterHarder
Дата 11.8.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Хо используют в методе Ньютона. В общем допустим у меня есть некое уравнение:
 Y(X) = x * x - 2x + 1 и его необходимо решить методом простых итераций. Т е по правилам математики необходимо решить уравнение х*х - 2х +1 =0, а так придется предположить, что допустим х = 2(любое, желательно максимально близкое). Т е если я правильно понимаю, то это и есть Хо(2).   
Метод простых итераций решения уравнения f(x) = 0 состоит в замене исходного уравнения эквивалентным ему уравнением x = Фи (x) и построении итерационной последовательности по формуле:

Хi+1 = Фи(Хi), i = 0,1,2,3,4..

может Фи штрих это есть разность Хi+1 - Xi? и она должна быть менее 1. 

Вот начинаю: сначала проверяю Хо =2:
2 = 2*2-2*2+1  -не верно, значит необходимо изменить анализируемый корень в меньшую сторону. Приращние задаю допустим 0.1
2 итерация:
1.9 = 1.9*1.9-2*1.9+1  - не верно ..
и таким образом добираюсь до 1 и в ерзультате получаю один из корней(через 10 итераций)? или как то не так? Подскажите как быть то?

Добавлено через 1 минуту и 31 секунду
и что еще интересно, у меня нет самой анализируемой функции, т е ее необходимо чтоли придумать самому или сделать возможность вводить само выражение функции с клавы. Тоже не очень понятно?
PM MAIL   Вверх
FasterHarder
Дата 12.8.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



в общем написал прогу, обрабатывающую не все корни, но считающую правильно и жестко привязанную к конкретной реализации:

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace FIFTH
{
    public partial class Form1 : Form
    {

        public int i = 0;
        public double root1;
        public double compare;
        double supposeRoot;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            i = 0;
            try
            {
                supposeRoot = double.Parse(txt_setRoot.Text);
            }
            catch (Exception exep)
            {
                MessageBox.Show("Неправильно задано значение предполагаемого корня! Укажите корректное значение!", "Сообщение для пользователя", MessageBoxButtons.OK);
                MessageBox.Show(exep.Message);

                return;
            }
            supposeRoot = findRoot(supposeRoot);
            txt_result.Text = supposeRoot.ToString();
            if (supposeRoot == -10000)
            {
                txt_countIterations.Text = "---";
            }
            else
            {
                txt_countIterations.Text = i.ToString();
            }            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            txt_setRoot.Focus();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        public double findRoot(double root)
        {
            // производная имеет вид: 3*Х^2 - 2
            // Намерение: получить количество итераций
            i++;
            root1 = Math.Pow(root, 3) - root + 1;
            // Намерение: проверить на условие, что первая производная по модулю не более 1
            double res = (3 * Math.Pow(root,2) - 2 );
            if(res < 0 && Math.Abs(res) >= 1) 
            {
                MessageBox.Show("Задайте более точное значение предполагаемого корня уравнения! Необходимо увеличить значение корня!", "Сообщение для пользователя", MessageBoxButtons.OK);
                return -10000;
            }
            else
            {
                if (res > 0 && Math.Abs(res) >= 1)
                {
                    MessageBox.Show("Задайте более точное значение предполагаемого корня уравнения! Необходимо уменьшить значение корня!", "Сообщение для пользователя", MessageBoxButtons.OK);
                    return -10000;
                }
                else
                {
                    compare = root1;
                    // Намерение: ищем корень уравнения с точностью до одной десятитысячной(можно указать другое)
                    if (Math.Abs(compare - root) <= 0.00001)
                    {
                        return root;
                    }
                    // Намерение: вызвать рекурсию для уточнения значения корня
                    root1 = findRoot(compare);
                }
            }
            return compare;
        }
    }
}


но все равно осталось куча нерешенных задач. Если пользователь введет значение предполагаемого корня, например -100, то будет сообщение уменьшить значение, когда необходимо увеличивать, все из за корня квадратногоsmile. Также нет возможности определить корень равным 1. А так ответ правильный получился, все перепроверил. Эхsmile.



Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  3600.JPG 27,69 Kb
PM MAIL   Вверх
Idsa
Дата 12.8.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



FasterHarder, у меня сложилось впечатление, что ты заново изобретаешь велосипед. Посети algolist.manual.ru.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
anonym
Дата 12.8.2007, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 27.11.2006

Репутация: 3
Всего: 3



Твой пример 
Цитата
Y(X) = x * x - 2x + 1
 не катит. Потому что если преобразовать его к виду x = f(x), мы получим, что f(x) = (x^2 + 1) / 2. Если мы берём начальное приближение на отрезке [a, b], то на (a, b) должно выполняться условие f'(x) < 1. Говоря математическим языком, в некоторой окрестности точки M (M - корень функуии) функция f(x) должна быть дифференцируема, и при этом должно выполняться |f'(x)| < 1.

Это сообщение отредактировал(а) anonym - 12.8.2007, 15:47
PM MAIL   Вверх
FasterHarder
Дата 12.8.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



где увидел икс в квадрате? я использую икс в кубе. в общем не понял тебя.
PM MAIL   Вверх
anonym
Дата 12.8.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 27.11.2006

Репутация: 3
Всего: 3



Да я просто твою цитату привёл  smile

Добавлено через 1 минуту и 41 секунду
Цитата(FasterHarder @  11.8.2007,  18:13 Найти цитируемый пост)
может Фи штрих это есть разность Хi+1 - Xi? и она должна быть менее 1. 

Да, кстати фи штрих - это и есть не что иное, как производная функции фи.

Добавлено через 8 минут и 12 секунд
Можно подставить x0 = 0.5 Тогда f'(x0) = (2*x0 + 0) / 2  = x0 = 0.5
Тогда x1 = f(x0) = (x0^2 + 1) / 2 = 0.625
x2 = (x1^2 + 1) / 2 = 0.695
x3 = (x2^2 + 1) / 2 = 0.74
и т.д.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0611 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.