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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2011, 12:42   #1
drzod
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 22
По умолчанию Лабораторная работа, найти ошибку

Пытался решить 2ю лабораторную работу, метод хука-дживса. Написал программу, запускается, все норм. Но что-то мне подсказывает, что она совершенно.

Писал программу в SharpDevelop

Код:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace huk
{
	public partial class MainForm : Form
	{
		public MainForm()
		{
			InitializeComponent();
		}
		double[] x0; //Координаты точки
		double[] y;
		double[] xp;
		double[] xk;
		double[] xk1;
		
		//Функция
		double fun(double[] x)
		{
			return(Math.Exp(Math.Pow((-Math.Pow((x[0]-3),2)-((x[1]-1)/3)),2))+Math.Exp(Math.Pow((-Math.Pow(((x[0]-2)/2),2)-(x[1]-2)),2)));
		}
		
		void Button1Click(object sender, EventArgs e)
		{
			//размерность
			int n = 2;
			xk = new double[n];
			x0 = new double[n];
			y = new double[n];
			xp = new double[n];
			xk1 = new double[n];
			//Считываем координаты точки
			x0[0]=double.Parse(textBox2.Text);
			x0[1]=double.Parse(textBox3.Text);
			//Шаг
			int h = Convert.ToInt32(textBox1.Text);
			//Точность
			double eps = Convert.ToDouble(textBox4.Text);
			//Определяем значение функции в точке X0
			double Z = fun(x0);
			//Промежуточная переменная хранящая значение функции, для сравнения
			double fi = Z;
			int j =1;

		X:
			fi=fun(x0);
			y = x0;
			//Проведем исследующий поиск
			//Увеличиваем на шаг и сравниваем
			for (int i = 0; i < n; i++) {
				xk[i]=y[i]+h;
			}
			Z = fun(xk);
			if (Z<fi) {
				y=xk;
				goto Q;	
			}
			
			//Уменьшаем на шаг
			for (int i = 0; i < n; i++) {
				xk[i]=y[i]-h;
			}
			Z = fun(xk);
			if (Z<fi) {
				y=xk;
				goto Q;
			}
			goto P;
			
		Q:
			//Делаем шаг в точку, после исследующего поиска
			//Находим значени функции в данной точке
			Z = fun(xk);
			fi = Z;
			//Проводим поиск по образцу
			for (int i = 0; i < n; i++) {
				xp[i] = xk[i] + (xk[i] - x0[i]);
			}
			y=xp;
			//Проводим поиск из точки xp в точку xk1
			for (int i = 0; i < n; i++) {
				xk1[i]=y[i]+h;
			}
			Z = fun(xk1);
			if (Z<fi) {
				goto E;
			}
			//Уменьшаем на шаг
			for (int i = 0; i < n; i++) {
				xk1[i]=y[i]-h;
			}
			Z = fun(xk1);
			
			if (Z<fi) {
				goto E;
			}
			if (h<eps) {				
				goto P;
			}
			else
			{
				h=h/10;
				goto X;
			}
			
		E:
			x0=xk;
			xk=xk1;
			goto Q;
			
		P:
			textBox5.Text=Convert.ToString(xk1[1]);
			textBox6.Text=Convert.ToString(xk1[0]);
			textBox7.Text=Convert.ToString(Math.Round((fun(xk1)),4));
		}
	}
}
Помогите пожалуйста найти ошибки....
И дайте советов по оптимизации кода. В программировании новичок, громоздко получилось
Изображения
Тип файла: jpg IMG_0083 (1).jpg (55.4 Кб, 138 просмотров)
Вложения
Тип файла: rar huk.rar (32.8 Кб, 15 просмотров)
drzod вне форума Ответить с цитированием
Старый 30.06.2011, 13:18   #2
drzod
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 22
По умолчанию

Одну ошибку нашел, у меня h -int, а надо double.

Но все равно хрень какая-то. Не может же одна и та же функция при разных начальных точках приходить к разному минимуму.
drzod вне форума Ответить с цитированием
Старый 30.06.2011, 13:29   #3
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

ставь breakpoint в начале нажатия бери листочек и проверяй.
Guy вне форума Ответить с цитированием
Старый 30.06.2011, 17:37   #4
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Цитата:
Но все равно хрень какая-то. Не может же одна и та же функция при разных начальных точках приходить к разному минимуму.
Метод Хука-Дживса не гарантирует нахождения глобального экстремума. Он ищет локальный, поэтому для разных начальных точек могут получаться разные локальные минимумы. Для одномерного случая вспомните функцию синуса. Сколько синус имеет экстремумов? В многомерных случаях могут быть функции состоящие из многих тысяч экстремумов. Попробуйте протестировать алгоритм на простых функциях вроде х*х, где минимум известен.Если поиск будет происходить нормально,то и для многомерных случаев, вероятно, все будет ок. Метод Хука-Дживса работает для одномерных случаев.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лабораторная работа jamik2012 Помощь студентам 0 23.10.2010 10:33
Лабораторная работа Новичек_Rudik Помощь студентам 2 19.04.2010 17:50
Курсовая работа на тему крестики-нолики. Помогите разобраться и найти ошибку. vanzer Паскаль, Turbo Pascal, PascalABC.NET 0 02.05.2009 21:16
Работа с TreeView. Помогите найти ошибку. AlDelta Компоненты Delphi 2 20.07.2007 12:31