2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3, 4  След.
 
 Re: метод половинного деления
Сообщение22.10.2012, 20:35 
venco в сообщении #634277 писал(а):
Вопрос к автору: где в вашей программе та самая функция, корень которой вы ищете?

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

 
 
 
 Re: метод половинного деления
Сообщение22.10.2012, 20:51 
Понятно. Согласен с TOTAL.

 
 
 
 Re: метод половинного деления
Сообщение22.10.2012, 21:02 
cyber_ua в сообщении #633530 писал(а):
в общем все понятно как работать с этим методом
:o

 
 
 
 Re: метод половинного деления
Сообщение22.10.2012, 21:08 
TOTAL в сообщении #634183 писал(а):
ewert в сообщении #634165 писал(а):
Приведите текст программы. Уже в который раз: судя по распечатке -- у Вас сам метод запрограммирован откровенно неверно.

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

вот как я понимаю (добавил описание в виде коментов)
код: [ скачать ] [ спрятать ]
Используется синтаксис C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {


           
            Console.WriteLine(Program.FindAccuracy(10,-4,-4,1));
            Console.ReadKey();
        }


        static double FindAccuracy(double num, double degree, double num1, double num2)
        {
            double Accuracy =  Math.Pow( num,degree);
            double[] root = Program.Interval(num1,num2);// расчет интервала на котором находится корень
            double x1 = root[0], x2 = root[1];// запись интервала в переменные
            double result  ;
         
     
           
           do {

               

                result = (x1 + x2) / 2;// приближаем значение к заданной точности по формуле (a+b) /2
               
                x1 = result;// перезаписываем значение а
               

            } while (Math.Abs(result) > Accuracy) ;
            return result;
        }

        static double[] Interval(double num1, double num2)
        {

         double value = (num1 + num2) / 2;//расчет по формуле (a+b)/2
       
        double[] interval = new double[2];
       interval[0] = value;

       if (num1 > 0 && value < 0 || num1 < 0 && value > 0)// поиск интервала с разными знаками
           interval[1] = num1;

       else interval[1] = num2;

        return interval;
    }

       

    }
}

 

 
 
 
 Re: метод половинного деления
Сообщение22.10.2012, 21:19 
Ну и как, теперь работает?

 
 
 
 Re: метод половинного деления
Сообщение22.10.2012, 21:28 
_Ivana в сообщении #634438 писал(а):
Ну и как, теперь работает?

эм.. т.е как?
ничего не изменилось кроме комментариев.

 
 
 
 Re: метод половинного деления
Сообщение22.10.2012, 21:43 
Именно. Да и комментарии скудны, неинформативны и абсолютно бессодержательны как сама программа.
Вас попросили объяснить словами сущность метода, ибо судя по программе, вы его не понимаете совершенно.

(Оффтоп)

Почему многие, кто просит помощи, сидят и ждут ответа на форуме вместо того, чтобы за 3 минуты найти в википедии и прочитать суть метода?

 
 
 
 Re: метод половинного деления
Сообщение22.10.2012, 21:59 
_Ivana в сообщении #634456 писал(а):
Именно. Да и комментарии скудны, неинформативны и абсолютно бессодержательны как сама программа.
Вас попросили объяснить словами сущность метода, ибо судя по программе, вы его не понимаете совершенно.

(Оффтоп)

Почему многие, кто просит помощи, сидят и ждут ответа на форуме вместо того, чтобы за 3 минуты найти в википедии и прочитать суть метода?


-нужно выделить интервал на котором находиться корень $(a+b) /2$ , т.е интервал на котором числа разных знаков
-нужно сужать интервал [a,(a+b )/2] || [(a+b)/2,b]
-когда значение меньше заданной точности остановить цикл.

 
 
 
 Re: метод половинного деления
Сообщение22.10.2012, 22:01 
cyber_ua в сообщении #634472 писал(а):
-нужно сужать интервал [a,(a+b )/2] || [(a+b)/2,b]
Где у вас в программе это самое ||?

 
 
 
 Re: метод половинного деления
Сообщение22.10.2012, 22:18 
venco в сообщении #634475 писал(а):
cyber_ua в сообщении #634472 писал(а):
-нужно сужать интервал [a,(a+b )/2] || [(a+b)/2,b]
Где у вас в программе это самое ||?

да тут я чет на портачил.

 
 
 
 Re: метод половинного деления
Сообщение23.10.2012, 08:26 
cyber_ua в сообщении #634472 писал(а):
т.е интервал на котором числа разных знаков

Здесь под числами имеются в виду не $a$ и $b$, а $f(a)$ и $f(b)$. Вы действительно считаете, что $f$ нигде не надо задавать? Дали отрезок, а программа сама найдет корень уравнения на нем? Какого уравнения?

 
 
 
 Re: метод половинного деления
Сообщение23.10.2012, 10:37 
И здесь у Вас тоже проблема
Цитата:
-когда значение меньше заданной точности остановить цикл

Значение чего?

 
 
 
 Re: метод половинного деления
Сообщение29.10.2012, 21:05 
вернулся снова к своей программе и кажется понял свою ошибку, а точнее чего я не понял.
Допустим a = -4, b = 1;
подставляем в формулу [a,(a+b )/2] || [(a+b)/2,b]
получаем $(-4+1)/2$ и получается -1,5 и вот дальше я не запутался что делать....
Понимаю что уже всех достал, но был бы пример решения разобрался бы сам.

 
 
 
 Re: метод половинного деления
Сообщение29.10.2012, 21:19 
Программу следует переписать с нуля. Чтобы на этот раз она хоть как-нибудь использовала данное в условии уравнение.

 
 
 
 Re: метод половинного деления
Сообщение29.10.2012, 21:23 
все нашел человеческое описанние
http://www.cyberforum.ru/post2138977.html писал(а):
Идея состоит в том, что если нам даны такие точки a и b, что f(a) < 0 < f(b), то функция f должна иметь по крайней мере один ноль на отрезке между a и b. Чтобы найти его, возьмем x, равное среднему между a и b, и вычислим f(x). Если f(x) > 0, то f должна иметь ноль на отрезке между a и x. Если f(x) < 0, то f должна иметь ноль на отрезке между x и b. Продолжая таким образом, мы сможем находить все более узкие интервалы, на которых f должна иметь ноль.


-- 29.10.2012, 22:24 --

arseniiv в сообщении #637497 писал(а):
Программу следует переписать с нуля. Чтобы на этот раз она хоть как-нибудь использовала данное в условии уравнение.

Я так и делаю, теперь сам не понимаю как такую фигню мог написать=)

-- 29.10.2012, 22:49 --

вот что получилось для нахождения на определенном интервале
код: [ скачать ] [ спрятать ]
Используется синтаксис C#
 double a = 0, b = 0,x;
            if (interval[0] < 0)
            {

                a = interval[0];
                b = interval[1];
            }
            else if(interval[1] < 0) {

                a = interval[1];
                b = interval[0];
            }

         


         do{


             x = (a + b) / 2;

             if (x > 0) b = x;
             else if (x < 0) a = x;


             Console.WriteLine(x);
           
           }while(Math.Abs(x) > accuracy);
 

цикл останавливается но результат получается какой то сильно маленький
Изображение

 
 
 [ Сообщений: 48 ]  На страницу Пред.  1, 2, 3, 4  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group