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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2012, 00:26   #1
Serg94
Форумчанин
 
Аватар для Serg94
 
Регистрация: 10.12.2011
Сообщений: 167
По умолчанию Метод золотого сечения

как организовать вывод этой программы??и правильно ли я записал??
нужно найти точку минимума...помогите пжлст
................................... ................................... ................................


Метод золотого сечения основан на делении отрезка [a,b] по правилу золотого сечения. Он позволяет сужать отрезок [a,b], каждый раз вычисляя лишь одно значение F(x), а не два, как в методе дихотомии. Данный метод реализуется следующим алгоритмом:
1. Находим коэффициент дробления k=( 5-1)/2 отрезка [a,b].
2. Находим абсциссу x =a+(1-k)(b-a) и вычисляем F(x ).
3. Находим абсциссу x =a+k(b-a) и вычисляем F(x ).
4. Проверяем выполнение условия |x - x |<E, где Е – заданная погрешность вычисления x. Если это условие выполняется, вычисляем x =(x +x )/2 и F(x ), после чего останавливаем счет с выдачей значений x и F(x ). Если данное условие не выполняется, идем к п.5.
5. Проверяем условие F(x )<F(x ). Если оно выполняется, полагаем a=x , x =x и F(x )= F(x ), после чего выполняется п.3 и п. 4.
6. Если F(x )F(x ), полагаем b=x , x =x , F(x )=F(x ), после чего выполняем п.2 и п.4.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace курсч
{
    class Program
    {
        static double func(double x)
        {
            double tmp = Math.Pow(2, 0.5);
            return 4 * Math.Sin(3 * x - 1) - Math.Pow(x, tmp) + 1;

        }
        static void Main(string[] args)
        {
            double epsilon = 0.001;
            //interval [1.5,2.5]
            double a = 1.5;
           double b = 2.5;
           double k = ((Math.Pow(5,05))-1)/2;
           double x = a + (1 - k) * (b - a); 
          func(x);
           double x1 =( a + k)*(b-a);
         func(x1);
           while (x - x1 < epsilon)
           {
               x = (x + x1) / 2; func(x);
               if (func(x1) < func(x))
               {
                   a = x;
                   x1 = x;
                   //func(x1) = func(x);
               }
               if (func(x1) >= func(x))
               {
                   b = x;
                   x1 = x;
               }

           }
        }
    }
}
Serg94 вне форума Ответить с цитированием
Старый 24.04.2012, 03:07   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Если Вы хотите, чтобы вам помогали, то потрудитесь описать алгоритм более корректно.
Цитата:
k=( 5-1)/2
x =(x +x )/2 и F(x )
x и F(x ).
F(x )<F(x )
F(x )F(x )
Попробуйте прочитать свой комментарий от третьего лица. Где какой x? какой аргумент передавать F? Особенно порадовало F(x) присвоить F(x).
Сейчас будет описан алгоритм, как я его понял:
1. Находим коэффициент дробления k=( sqrt(5)-1)/2 отрезка [a,b].
2. Находим абсциссу x0 =a+(1-k)(b-a) и вычисляем F(x0).
3. Находим абсциссу x1 =a+k(b-a) и вычисляем F(x1).
4. Проверяем выполнение условия: |x0 - x1 |<E, где Е –заданная
погрешность вычисления x. Если это условие выполняется,
вычисляем x0 =(x0 +x1)/2 и F(x0), после чего останавливаем
счет с выдачей значений x0 и F(x0). Если данное условие не
выполняется, идем к п.5.
5. Проверяем условие F(x1)<F(x0). Если оно выполняется,
полагаем a=x, x1=x и F(x1)=F(x0), после чего выполняется
п.3 и п. 4.
6. Если F(x1 )>=F(x0 ), полагаем b=x ,x1=x , F(x1)=F(x0), после
чего выполняем п.2 и п.4.
Если это так, то вот реализация алгоритма:
Код:
......
 static double func(double x)
        {
            double tmp = Math.Pow(2, 0.5);
            return 4 * Math.Sin(3 * x - 1) -
	    Math.Pow(x, tmp) + 1;
        }

static void Main(void)
        {  double epsilon = 0.001;
           double a = 1.5; double b = 2.5; double k = 1.618;
           double x = a+(1-k)*(b-a); fx=func(x);
           double x1 =(a+k)*(b-a);   fx1=func(x1);
           while 0=0
           {   if (x0-x1)<epsilon
               { x = (x+x1) / 2;
	         doudle fx=func(x);
		 break;
	       }
	       else
               if (func(x1) < func(x))
               { a = x; x1 = x;               
		 x1 =(a+k)*(b-a);   fx1=func(x1);
               }
	       else
               if (func(x1) >= func(x))
               { b = x; x1 = x;
		 x = a+(1-k)*(b-a); fx=func(x);
               }
           }
        }  cout<<x<<"   "<<fx;
......
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 24.04.2012, 03:23   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Rin, ваш код почему-то "не хочет" работать в Ideone.com (мне больше нечем скомпилировать).

Мой вариант:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr1
{
    class Program
    {
        static double func(double x)
        {
            double tmp = Math.Pow(2, 0.5);
            return 4 * Math.Sin(3 * x - 1) - Math.Pow(x, tmp) + 1;

        }
        static void Main(string[] args)
        {
			double epsilon = 0.001;
           //interval [1.5,2.5]
			double a = 1.5;
			double b = 2.5;
			double k = 0.618;//((Math.Pow(5,05))-1)/2;
			double x1 = a + (1 - k)*(b - a); 
			double y1 = func(x1);
			double x2 = a + k*(b - a);
			double y2 = func(x2);

           while (b - a > epsilon)
           {			
                if (y1 > y2)
				{
					a = x1;
					x1 = x2;
					x2 = a + k*(b - a);
					y1 = y2;
					y2 = func(x2);
				}
				else
				{
					b = x2;
					x2 = x1;
					x1 = a + (1 - k)*(b - a); 
					y2 = y1;
					y1 = func(x1);
				}
           }
		   double x = (a + b)/2;
		   Console.WriteLine(x);
		   Console.WriteLine(func(x));
           Console.ReadKey();
        }
    }
}
Только не понял, почему неправильно считается k (все в том же Ideone.com).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 24.04.2012, 14:47   #4
Serg94
Форумчанин
 
Аватар для Serg94
 
Регистрация: 10.12.2011
Сообщений: 167
По умолчанию .....

Цитата:
Сообщение от Rin Посмотреть сообщение
Если Вы хотите, чтобы вам помогали, то потрудитесь описать алгоритм более корректно.

Попробуйте прочитать свой комментарий от третьего лица. Где какой x? какой аргумент передавать F? Особенно порадовало F(x) присвоить F(x).
Сейчас будет описан алгоритм, как я его понял:
1. Находим коэффициент дробления k=( sqrt(5)-1)/2 отрезка [a,b].
2. Находим абсциссу x0 =a+(1-k)(b-a) и вычисляем F(x0).
3. Находим абсциссу x1 =a+k(b-a) и вычисляем F(x1).
4. Проверяем выполнение условия: |x0 - x1 |<E, где Е –заданная
погрешность вычисления x. Если это условие выполняется,
вычисляем x0 =(x0 +x1)/2 и F(x0), после чего останавливаем
счет с выдачей значений x0 и F(x0). Если данное условие не
выполняется, идем к п.5.
5. Проверяем условие F(x1)<F(x0). Если оно выполняется,
полагаем a=x, x1=x и F(x1)=F(x0), после чего выполняется
п.3 и п. 4.
6. Если F(x1 )>=F(x0 ), полагаем b=x ,x1=x , F(x1)=F(x0), после
чего выполняем п.2 и п.4.
Если это так, то вот реализация алгоритма:
Код:
......
 static double func(double x)
        {
            double tmp = Math.Pow(2, 0.5);
            return 4 * Math.Sin(3 * x - 1) -
	    Math.Pow(x, tmp) + 1;
        }

static void Main(void)
        {  double epsilon = 0.001;
           double a = 1.5; double b = 2.5; double k = 1.618;
           double x = a+(1-k)*(b-a); fx=func(x);
           double x1 =(a+k)*(b-a);   fx1=func(x1);
           while 0=0
           {   if (x0-x1)<epsilon
               { x = (x+x1) / 2;
	         doudle fx=func(x);
		 break;
	       }
	       else
               if (func(x1) < func(x))
               { a = x; x1 = x;               
		 x1 =(a+k)*(b-a);   fx1=func(x1);
               }
	       else
               if (func(x1) >= func(x))
               { b = x; x1 = x;
		 x = a+(1-k)*(b-a); fx=func(x);
               }
           }
        }  cout<<x<<"   "<<fx;
......
мне такое задание дали..я сам не мог разобраться и написал сюда!!!
Serg94 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
оч нужно!!в Паскале Метод золотого сечения. АлинКО Паскаль, Turbo Pascal, PascalABC.NET 1 08.11.2011 10:20
в Паскале Метод золотого сечения. не понимаю совсем( АлинКО Помощь студентам 0 23.12.2010 19:14
Метод золотого сечения ramone Помощь студентам 0 14.05.2010 17:02
Метод золотого сечения Dasharnb777 Фриланс 4 15.02.2010 17:31
метод золотого сечения выдает ошибку... Skif Помощь студентам 7 09.04.2007 07:23