Метод деление интервала пополам (одномерная оптимизация) - C#
Формулировка задачи:
Вот функция:
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.
Вот неработающий пример на с++
#include<iostream.h> #include<math.h> #include<conio.h> #include<stdio.h> double f(double x) {double f; f=(х*х*х)+8*(х*х)+х+5; return f; } void main() { const double e=0.00001; //tochnost` double a=-2, b=5; double x[5], y[4], yl, xl; int i, N, l; clrscr(); cout<<"Method delenija intervala popolam"<<endl; x[2]=(a+b)/2; //seredina otrezka neopredelennosty y[2]=f(x[2]); N=1; //schetchik experimentov while (b-a > 2*e) { x[0]=a; x[4]=b; x[1]=(a+x[2])/2; y[1]=f(x[1]); x[3]=(x[2]+b)/2; y[3]=f(x[3]); N=N+2; yl=y[1]; xl=x[1]; l=1;//poisk minimuma for (i=2; i<4; i++) if (yl>y[i]) {yl=y[i]; xl=x[i]; l=i;} a=x[l-1]; b=x[l+1]; x[2]=xl; y[2]=yl; } cout<<endl<<"Kol-vo experimentov N="<<N<<endl; cout<<endl<<"x = "<<x[2]<<endl; cout<<"y = "<<y[2]<<endl; getch(); }
Помогите на С# пожалуйста?
Решение задачи: «Метод деление интервала пополам (одномерная оптимизация)»
textual
Листинг программы
namespace interval_MO { class Program { static void Main(string[] args) { Console.WriteLine("y=4*x-16/x^2 \nx[1,5]"); Console.WriteLine("Левая граница a:"); double x_left = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Правая граница b:"); double x_right = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Точность:"); double eps = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("----------------------"); int count = 0; double x, xm, L, x1, x2; xm = (x_left + x_right) / 2; L = x_right - x_left; Console.WriteLine(xm); Console.WriteLine(L); x1 = x_left + L / 4; x2 = x_right - L / 4; Console.WriteLine(x1); Console.WriteLine(x2); Console.WriteLine(Y(xm)); while (L >= eps) { count++; if (Y(x1) < Y(xm)) { x_right = xm; xm = x1; } else { if (Y(x2) < Y(xm)) { x_left = xm; xm = x2; } if (Y(x2) > Y(xm)) { x_left = x1; x_right = x2; } } L = x_right - x_left; x1 = x_left + L / 4; x2 = x_right - L / 4; x = xm; //Console.WriteLine(x1); //Console.WriteLine(x2); //Console.WriteLine(xm); Console.WriteLine(L); } Console.WriteLine("Решение:" + xm); Console.WriteLine("Количество итераций:" + count); Console.ReadLine(); } static double Y(double x) { double y = Math.Pow(x, 3) + 8 * Math.Pow(x, 2) + x + 5; return y; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д