powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / не получается разобраться с методом простой итерации при решении уравнения
22 сообщений из 22, страница 1 из 1
не получается разобраться с методом простой итерации при решении уравнения
    #34721841
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

Всем программистам привет! Respect! В общем столкнулся с такой проблемой, как решение(на уровне логики, т к программировать там элементарно) уравнения методом простой итерации:
авторРешить методом итераций уравнение вида x=Фи(x). Очередное приближение корня находится по формуле Xn= Фи ( Xn-1 ); начальное приближение Xo задается произвольно. Обратить внимание, что метод сходится, если только | Фи штрих (x) | < 1.

стал искать инфу и кое что нашел в инете:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
 Как известно, многие уравнения и системы уравнений не имеют аналитических решений. В первую очередь это относится к большинству трансцендентных уравнений. Доказано также, что нельзя построить формулу, по которой можно было бы решить произвольное алгебраическое уравнение степени выше четвертой. Однако такие уравнения могут решаться итерационными методами с заданной точностью.

 

Итерационные методы

 

Задача нахождения корня уравнения f(x) = 0 итерационными методами состоит в следующем: 

отделение корней - отыскание приближенного значения корня (например, графическим методом); 
уточнение корней - доведение их значений до заданной степени точности e . 
При использовании метода Нъютона необходимо задаться начальным приближением х0, расположенным достаточно близко к точному значению корня. Итерационный процесс строится по формуле:

,  ... (1)
 

Метод простых итераций решения уравнения f(x) = 0 состоит в замене исходного уравнения эквивалентным ему уравнением x = j (x) и построении итерационной последовательности по формуле:

xi+1 = j (xi), ... (2)
 

Достаточным условием сходимости рассмотренных итерационных процессов является выполнение неравенства

 (3)
 

на каждом шаге итерации.

until(a, z) возвращает z, пока выражение a не становится отрицательным; а должно содержать дискретный аргумент. 

но я немного не понимаю, какой уравнение f(x) = 0 необходимо будет решать(т к F(x) необходимо заменить на х = j(x)), т е любое, введенное в какое либо текстовое поле с клавы(или нечто подобное). А штрих, это типа производная? Может кто нить делал нечто подобное ранее, подскажите логическую схему действий. Подскажите как быть то?
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #34721920
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

Хо используют(как прочел в инете) в методе Ньютона. В общем допустим у меня есть некое уравнение:
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 итераций)? или как то не так? Подскажите как быть то?

и что еще интересно, у меня нет самой анализируемой функции, т е ее необходимо придумать самому или сделать возможность вводить само выражение функции с клавы. Тоже не очень понятно?
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #34721986
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Х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 итераций)? или как то не так? Подскажите как быть то?

и что еще интересно, у меня нет самой анализируемой функции, т е ее необходимо придумать самому или сделать возможность вводить само выражение функции с клавы. Тоже не очень понятно?

Все неверно.
Штрих -- это производная.
Уравнение x^2-2x+1=0 переписывается в виде эквивалентного уравнения
x=x^2- x +1. Не -2х, а просто -х !!!
Правая часть обозначается за Ф(x)
Ф(х)=x^2-x+1
Пусть x_0 = 0,5 (при х=2 производная слишком большая)
Тогда x_1 = Ф(x_0)=Ф(0,5)=0,5^2-0.5+1=0.75
x_2=Ф(x_1)=Ф(0.75)=0.75^2-0.75+1=13/16
и так далее
Чем дальше, тем ближе x к искомому корню 1.

В таких задачах (а это задача на итерационный метод, а не заказ на изготовление программы) не следует путать божий дар с яичницей. Понимание по написанной в окошке формуле, что же это за формула, есть отдельная нетривиальная задача. Так что в твоем случае в программе просто есть функция
Код: plaintext
1.
double f(double x);
зашитая в программу. Конечно, программа должна сносно работать при любой вменяемой f(x).
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #34722024
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

это хорошо, что рассмотрен такой пример х*х - 2* +1, а если б е^х*х*х - sin2x*arctgx..(можно придумать сумашедшее по сложности что нить в 20 степенях:)), то как тогда подгадать с какого значения х начинать(можно попасть на триллионы итераций тогда получается )?(в простых примерах корень можно предвосхитить с хорошей точностью:)). Я понимаю прекрасно, что штрих это производная и как ее посчитать, но как это увязать с усовием,что она должна быть менее 1 по модулю?. Чтобы написать прогу, мне придется зашить некую функцию(трансцендентное уравнение) и на основе ее уже показать алгорит простой итерации?
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #34722042
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воощета все люди которых я знаю и которые начали программировать в 83 или ранее только этими вещами н занимались, больше тогда на компах по большому счёту и делать то было нечего. Чем же Вы то до 17 года занимались?

Fast&Furiousэто хорошо, что рассмотрен такой пример х*х - 2* +1, а если б е^х*х*х - sin2x*arctgx..(можно придумать сумашедшее по сложности что нить в 20 степенях:)), то как тогда подгадать с какого значения х начинать(можно попасть на триллионы итераций тогда получается )?(в простых примерах корень можно предвосхитить с хорошей точностью:)). Я понимаю прекрасно, что штрих это производная и как ее посчитать, но как это увязать с усовием,что она должна быть менее 1 по модулю?.

А никак. Вам что, кто-то сказал что методом простой итерации всегда можно найти корень? Если да, то тот кто это сделал забыл сказать что это шутка. Если корень таков, что в его окрестности производная не удовлетворяет этому условию, то найти такой корень этим методом нельзя. Как выбрать начальное приближение? Если функция только одного переменного - ну попробуйте деление пополам. Достигнете какой-нибудь достаточно малой с Вашей точки зрения невязки и убедитесь что производная функции по модулю меньше 1 - перейдёте на метод простой итерации.

Fast&FuriousЧтобы написать прогу, мне придется зашить некую функцию(трансцендентное уравнение) и на основе ее уже показать алгорит простой итерации?

На эту тему предыдущий оратор Вам уже сказал - грамотно написанная реализация метода простой итерации в качестве одного из своих входных параметров будет иметь (предположим Вы пишите на C) указатель на функцию, кот. вычисляет значение той математической функции, корень которой Вы хотите найти. Так что ничего "зашивать" не надо.

Успехов.
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #34722074
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!


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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
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, то будет сообщение уменьшить значение, когда необходимо увеличивать, все из за корня квадратного:). Также нет возможности определить корень равным 1. А так ответ правильный получился, все перепроверил. Эх:).
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #34722251
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор, перепиши программу!
1. Пойми, что ты реализуешь метод, а не разрабатываешь его. Не твоя головная боль, сколько корней он может найти и для каких функций. Ты просто его применяешь и констатируешь: метод дал корень / метод не сработал.
2. По знаку производной нельзя понять, слева или справа от данной точки лежит корень. Поэтому предложения "увеличьте/уменьшите начальное значение" взяты с потолка. Просто констатируешь, что с таким значением далеко не посчитаешь и все.
3. Еще раз. Функция (и ее производная) -- внешние к методу параметры. Нельзя их вшивать в метод! Потому что если я хочу решать другое уравнение, мне надо моск сломать, ища, что в твоей программе поменять. Должны быть просто две функции, которые в соотв. местах вызываются.
4. Тебя просили решить уравнение вида х=Ф(х), а не найти корни соответствующей функции f(x)=Ф(х)-х (как это написано на форме). Лучше точно следовать заданию.
5. Не надо делать рекурсии, она тут не к месту. Метод итерационный, а не рекурсивный! Тут рекурсия затрудняет понимаение и кушает лишние ресурсы.
6. Переменным -- более адекватные имена. root1 -- не понял, что это значит.
7. Все магические константы 0.00001 вынести из кода в константы либо вводимые пользователем параметры.
8. Хорошо бы еще ограничить число итераций на всякий случай (еще один параметр метода).
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #34722272
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

спасибо за замечания grieg, учту.
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #34722506
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

авторЧем же Вы то до 17 года занимались?

готовился к октябрьской революции:).
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #34836704
Fructis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
посмотри на http://negusta.narod.ru/
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #34842460
LeonM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужен метод простой итерации , то без проверок зацикливания (счет числа циклов) и расходимости (try/catch) он занимает 3 строки
Код: plaintext
1.
2.
3.
4.
5.
double DirectIteration(double e, double x, double (*f)(double))
{
	while ((x-f(x))*(x-f(x))>e*e)
		x=f(x);
	return f(x);
}
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #34844875
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
double DirectIteration(double e, double x, double (*f)(double))

Ага, теперь не забудьте раз'яснить что f(x) в сигнатуре Вашего метода - это не та функция, корень которой необходимо найти. Конечно дело вкуса, но мне это не нравится.
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #35074556
homosapiens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди помогите пожалуйста, не могу решить похожую задачу.
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #35074569
homosapiens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
текст задачи : решить уравнение f(x)=0 мтодом Ньютона, с помощью рекурсии.
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #35074572
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
homosapiensтекст задачи : решить уравнение f(x)=0 мтодом Ньютона, с помощью рекурсии.

Для начала стоит просто прочитать учебник. Сразу половина станет ясна - и вопросы станут конкретнее: видно же, что даже не брался за решение.
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #35074619
homosapiens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я нашел сам алгоритм и его код но без рекурсии, я плохо знаю программинг, у знакомых спрашивал не смогли, посоветовали обратиться к вам
http://alglib.sources.ru/equations/feq0newton.php
это ссылка на алг.
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #35077423
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, изврат однако, ну почему бы нет? Сразу скажу, ни компилировать, ни дебажить не буду, если оно Вам серьёзно надо - доводите до ума сами. Итак, для одного нелинейного уравнения заданного в виде f(x) = 0:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
#include<stdio.h>

typedef double (*pFunc)(double) func;
const double delta =  1 .0D- 09 ;
const double machineZero =  1 .0D- 12 ;

int Root(double&, func, const double, const double, const int);
double MyFunc(const double);

int main()
{
     int nMaxIter =  10 ;     

     //initial guess
     double x =  1 . 0 ;
     int nIter = Root(x,MyFunc,delta,machineZero,nMaxIter);

     if(nIter >  0 )
         printf("Root %d found after %i iterations\n", x, nIter);
     else
         printf("Algorithm was unable to find a root in %i iterations, either increase the max allowed number of iterations or chose another intial guess\n", nMaxIter);

     return  0 ;
}

double MyFunc(const double x)
{
     return f(x); //replace f(x) with specific analytical expression for f(x)
}

int Root(double& x, func AFunction, const double eps, const double mZero, const int nMaxIter)
{
      static int iTer;

      //check if the ordinal number of the current iteration exceeds nMaxIter:
      if(iTer > nMaxIter)
        return - 1 ;  

      //do one cycle
      iTer++;

      //compute derivative
      double lVal = AFunction(x - mZero);
      double rVal = AFunction(x + mZero);

      double Derivative =  0 . 5  * (rVal - lVal) / mZero;

      x -= AFunction(x)/Derivative;

      if(fabs(AFunction(x)) < eps)
         return iTer;
      else
         Root(x, AFunction, eps, mZero, nMaxIter);
}

Вообщем никаких проверок на близость производной к нулю в данной реализации не делается - отсюда могут быть деления на нуль и arithmetic overflow - если хотите корректно орабатывать такие ситуации - добавьте соответствующий код сами. Да, и машинный ноль можно было бы определять по-элегантней, скажем динамически через nextafter(), но это опять же сами.
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #35535431
BAC9I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Найти корень уравнения х^3-x+1=0 методом простых итераций с точностью 0,01 на промежутке [-2;-1] Напишите цепь решения :) плиз :)
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #35535445
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BAC9IНайти корень уравнения х^3-x+1=0 методом простых итераций с точностью 0,01 на промежутке [-2;-1] Напишите цепь решения :) плиз :)
Возьмите любую методичку или лекции по вышке за 1 курс . Там все есть.

Ну, в конце концов, почитайте:
http://i026.radikal.ru/0809/57/6b4fa584ca6e.jpg
http://s52.radikal.ru/i138/0809/08/3f0d141a5b77.jpg
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #35535446
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если интересовало, как народ для начала (очень давно уж) пишет проги
для этого, то можно сходить сюда
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #35536128
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чё-то не пойму, семестр вроде тока начался, до сессии далеко. чё все кинулись лабы делать? или это заочники?
и что, в методичках нету примеров с разьяснениями? не поверю. на 3-м или 4-м курсе у меня были подобные задачи, но как-то доступа на форум не было всвязи с отсутствием интернета. потому все обходились тем что есть в библиотеке, но данный курс (не помню как назывался) сдали все мои одногруппники. так что не ленитесь, а читайте методички
...
Рейтинг: 0 / 0
не получается разобраться с методом простой итерации при решении уравнения
    #35537629
W_and_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то никто не вспомнил про Педевикию, там тоже неплохо написано:
http://ru.wikipedia.org/wiki/Метод_Ньютона
Особое внимание советую обратить на случай обращения метода на комплексную плоскость, очень красивые картинки можно получить.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / не получается разобраться с методом простой итерации при решении уравнения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]