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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2012, 18:09   #1
unijkoder
Пользователь
 
Регистрация: 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.


Помогите пожалуйста?
unijkoder вне форума Ответить с цитированием
Старый 28.02.2012, 23:09   #2
unijkoder
Пользователь
 
Регистрация: 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;
}
}
}
unijkoder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод деления пополам (дихотомии) Килямов Сергей Помощь студентам 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