|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
27.02.2012, 18:09 | #1 |
Пользователь
Регистрация: 21.01.2012
Сообщений: 37
|
Метод деление интервала пополам (одномерная оптимизация)
Вот функция:
f(x) = (x*x*x)+8*x*x+x+5 интервал (-2,5) Вот алгоритм: Метод деления интервала пополам Методы поиска, которые позволяют определить оптимум функции одной переменной путем последовательного исключения подынтервалов и, следовательно, путем уменьшения интервала, носят название методов исключения интервалов. Унимодальность функций является исключительно важным свойством. Фактически все одномерные методы поиска, используемые на практике, основаны на предположении, что исследуемая функция в допустимой области, по крайней мере, обладает свойством унимодальности. Полезность этого свойства определяется тем фактом, что для унимодальной функции f(x) сравнение значений f(x) в двух различных точках интервала поиска позволяет определить, в каком из заданных двумя указанными точками подынтервалов точка оптимума отсутствует. Теорема. Пусть функция f унимодальна на замкнутом интервале a x b, а ее минимум достигается в точке x*. Рассмотрим точки x1 и x2, расположенные в интервале таким образом, что a<x1<x2<b. Сравнивая значения функции в точках x1 и x2, можно сделать следующие выводы. 1. Если f(x1)>f(x2), то точка минимума f(x) не лежит в интервале (a, x1), т.е. x* (x1, b) (рисунок 2). 2. Если f(x1)<f(x2), то точка минимума f(x) не лежит в интервале (x2, b), т. е. x* (a, x2) расположения пробных точек x1 и x2 внутри интервала поиска. Рассматриваемый метод позволяет исключать в точности половину интервала на каждой итерации. Ниже приводится описание основных шагов поисковой процедуры, ориентированной на нахождение точки минимума функции f(x)в интервале (a,b). Шаг 1. Вычислить значения xm= (a+b)/2, L=b-a, f(xm). Шаг 2. Вычислить x1=a+L/4 и x2=b-L/4. точки x1, x2, xm делят интервал (a,b) на четыре равные части. Вычислить значения f(x1) и f(x2). Шаг 3. Сравнить f(x1) и f(xm). Если f(x1)<f(xm), исключить интервал (xm, b), заменив b=xm. Средней точкой нового интервала поиска становится точка x1, а xm=x1. Перейти к шагу 5. Если f(x1) f(xm), перейти к шагу 4. Шаг 4. Сравнить f(x2) и f(xm). Если f(x2)<f(xm), исключить интервал (a, xm), заменив a=xm. Так как средней точкой нового интервала становится точка x2, заменить xm=x2. Перейти к шагу 5. Если f(x2) f(xm), исключить интервалы (a, x1) и (x2, b). Заменить a=x1 и b=x2. xm продолжает оставаться средней точкой нового интервала. Перейти к шагу 5. Шаг 5. Вычислить L=b-a. Если величина мала, закончить поиск. В противном случае вернуться к шагу 2. Помогите пожалуйста? |
28.02.2012, 23:09 | #2 |
Пользователь
Регистрация: 21.01.2012
Сообщений: 37
|
Вот что получилось. Работает неправильно...
Где ошибка? using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication345 { class Program { static void Main(string[] args) { Console.WriteLine("y=x^3+8x^2+x+5 \nx[-2,5]"); Console.WriteLine("Левая граница:"); double x_left = Convert.ToDouble(Console.ReadLine() ); Console.WriteLine("Правая граница:"); double x_right = Convert.ToDouble(Console.ReadLine() ); Console.WriteLine("Точность:"); double eps = Convert.ToDouble(Console.ReadLine() ); Console.WriteLine("----------------------"); int count = 0; Console.WriteLine(Y(x_left)); Console.WriteLine(Y(x_right)); double x = (x_left + x_right) / 2; Console.WriteLine(Y(x) + "\n--------------------"); while (Math.Abs(Y(x))>eps) { count++; if (Y(x) * Y(x_left) < 0) { x_right = x; } else { x_left = x; } x = (x_left + x_right) / 2; Console.WriteLine(Y(x) + "\n"); } Console.WriteLine("Решение:" + x); Console.WriteLine("Количество итераций:" + count); Console.ReadLine(); Console.ReadKey(); } static double Y(double x) { double y = Math.Pow(x, 3) + 8 * Math.Pow(x, 2) + x + 5; return y; } } } |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Метод деления пополам (дихотомии) | Килямов Сергей | Помощь студентам | 3 | 01.11.2011 18:13 |
Метод деления пополам Си++ | nikozavr | Общие вопросы C/C++ | 10 | 12.02.2011 11:36 |
Метод деления отрезка пополам | Витяака | Помощь студентам | 2 | 23.12.2010 11:42 |
Деление байта пополам | necroant | Общие вопросы C/C++ | 19 | 18.06.2010 04:17 |
одномерная оптимизация методом дихотомии | DiGris | Помощь студентам | 1 | 26.05.2010 01:24 |