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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2012, 02:18   #1
Defunate
Пользователь
 
Регистрация: 11.09.2010
Сообщений: 83
По умолчанию Градиентный метод

Проблема с градиентным методом,с закоментированным уравнением считает нормально,но с другим значение точек увеличивается просто в прогрессии,кто знает где ошибка?

Код:
namespace Wpf3DTest
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        public static string[] str = new string[10000];
        public static PointPairList list = new PointPairList();
        const int V = 3;
        struct P
        {
            public double C, H;
            public P(double x1, double x2)
            {
                C = x1;
                H = x2;
            }
        public static P operator *(P v1, P v2)
        {
            return new P(v1.C * v2.C, v1.H * v2.H);
        }
        public static P operator -(P v1, P v2)
        {
            return new P(v1.C - v2.C, v1.H - v2.H);
        }
            public override string ToString()
            {
                return "(" + this.C.ToString("f5") + ";" + this.H.ToString("f5") + ")";
            }
        }
        
        class Calc
        {
            public static double f(P p)
            {
                double c = p.C;
                double h = p.H;
                return 3 * c * h + (V / (1.5 * c * h)) * (c + 2 * Math.Sqrt(0.25 * c * c + h * h));
                    //-2*c+0.1*c*c+3*h+0.1*h*h-3;
            }
            public static P gradient(P p)
            {
                double c = p.C;
                double h = p.H;
                double gradc = 3 * h - (V / (1.5 * c * c * h)) * (c + 2 * Math.Sqrt(0.25 * c * c + h * h)) + (V / (1.5 * c * h)) * (1 + 0.5 * c / (Math.Sqrt(0.25 * c * c + h * h)));
                double gradp = 3 * c - (V / (1.5 * c * h * h)) * (c + 2 * Math.Sqrt(0.25 * c * c + h * h)) + (V / (1.5 * c * h)) * (2 * h / (Math.Sqrt(0.25 * c * c + h * h)));
                P N = new P(gradc,gradp);
                   // -2 + 0.2 * c, 3 + 0.2 * h);
                return N;
            }
            public static double norma(P c)
            { 
                return Math.Sqrt(c.C * c.C + c.H * c.H); 
            }
            public static void operate(double eps, ref P ca, out double fn, out int i)
            {
                P cb = new P(1, 1), st = new P(0.5, 0.5);
                P step = new P(1, 1), eq; i = 0;
                do
                {
                    while (true)
                    {
                        cb = ca - step * gradient(ca);
                        eq = st * step * gradient(cb) * gradient(cb);
                        if (f(cb - step * gradient(cb)) >= (f(cb) - norma(eq)))
                        {
                            step.C /= 2;
                            step.H /= 2;
                        }
                        else break;
                    }
                    fn = f(ca);
                    i++;
                    str[i] = String.Format("{0}" + ") " + "{1}" + "; " + "{2}" + "; " + "{3}" + ".", i.ToString(), ca.ToString(), Math.Round(fn, 5).ToString("f6"), norma(gradient(cb)).ToString("f6"));
                    ca = cb;
                    list.Add(ca.C, ca.H);
                }
                while (norma(gradient(cb)) >= eps);
                fn = f(cb);
            }
        }
Defunate вне форума Ответить с цитированием
Старый 15.01.2012, 02:19   #2
Defunate
Пользователь
 
Регистрация: 11.09.2010
Сообщений: 83
По умолчанию

Код:
        private void Calculate_Click(object sender, EventArgs e)
        {
            GraphPane pane = zedGraphControl1.GraphPane;
            pane.CurveList.Clear();
            listBox1.Items.Clear();
            double Et = Convert.ToDouble(textBox3.Text);
            double fn;
            int j;
            double x1start = double.Parse(textBox1.Text);
            double x2start = double.Parse(textBox2.Text);
            list.Add(x1start,x2start);
            P mas = new P(x1start, x2start);
            Calc.operate(Et, ref mas, out fn, out j);
            label1.Text = String.Format("{0}" + "; " + "{1}" + "; " + "{2}", mas.ToString(), Math.Round(fn, 5).ToString("f6"), j.ToString());
            for (int i = 1; i < j; i++)
            {
                listBox1.Items.Add(str[i]);
            }
            PointPairList listonePoint = new PointPairList();
            listonePoint.Add(mas.C, mas.H);
            P antigrad = Calc.gradient(new P(double.Parse(textBox1.Text),double.Parse(textBox2.Text)));
            ArrowObj arrow = new ArrowObj(0, 0, -antigrad.C, -antigrad.H);
            arrow.Line.Color = Color.Green;
            pane.GraphObjList.Add(arrow);
            pane.XAxis.MajorGrid.IsZeroLine = true;
            pane.YAxis.MajorGrid.IsZeroLine = true;
            pane.XAxis.Scale.Min = -25;
            pane.XAxis.Scale.Max = 25;
            pane.YAxis.Scale.Min = -25;
            pane.YAxis.Scale.Max = 25;
            pane.XAxis.Title.IsVisible = false;
            pane.YAxis.Title.IsVisible = false;
            pane.XAxis.MajorGrid.IsVisible = true;
            pane.YAxis.MajorGrid.IsVisible = true;
            pane.Fill = new Fill(Color.White, Color.LightSkyBlue, 45.0f);
            pane.Chart.Fill.Type = FillType.None;
            zedGraphControl1.AxisChange();
            for (int i = 0; i < list.Count; i++)
            {
                if (i == list.Count - 1)
                {
                    break;
                }
                LineObj line = new LineObj(list[i].X, list[i].Y, list[i + 1].X, list[i + 1].Y);
                pane.GraphObjList.Add(line);
                LineItem myCurve1 = pane.AddCurve(string.Empty, listonePoint, Color.Blue, SymbolType.Circle);
                myCurve1.Symbol.Size = 20 * i;
            }
            zedGraphControl1.Invalidate();
        }
    }
}
Defunate вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
исследовать метод квадратных корней и метод Холецкого для решения СЛАУ Vит@x@ Помощь студентам 0 22.11.2011 10:47
Задача Коммивояжера. Метод Монте-Карло и метод приращений. [Паскаль] U9110 Помощь студентам 4 06.04.2011 09:48
Градиентный спуск Ciberal Помощь студентам 0 26.12.2010 19:23
Turbo Pascal[програмыки : текстовая\метод симпсона\метод половинного деления qsccsq Помощь студентам 7 24.12.2010 05:23
Градиентный спуск nieaCry Общие вопросы C/C++ 0 04.12.2008 00:26