Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

"Решалка" квадратичных уравнений (Александр Михалицын)
Author Message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Thu May 28, 2009 7:17 pm (написано за 4 минуты 4 секунды)
   Post subject: "Решалка" квадратичных уравнений
Reply with quote

Что-то сегодня захотелось мне её написать и я написал... =)
Вобщем, она разбирает квадратичные уравнение в стандартном виде многочлена (не требующем упрощения, а также с наибольшей степенью, стоящей спереди).
Вторая степень обозначается "^2" (да-да я знаю что это не знак степени, но ничего другого в голову не пришло...).

Код ниже, пример тоже... Еще я писал "строилку" графиков функций... =) Это тоже потом выложу... ;)

Специально для школьников, которые вдруг забретут на этот форум, в поисках ГДЗ или чего-то подобного... =)
Вам лучше не пользоваться этой штукой, а научится решать эти уравнения самим... =)


см. код ниже.

Last edited by Александр Михалицын on Fri May 29, 2009 4:51 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Thu May 28, 2009 8:00 pm (спустя 43 минуты; написано за 3 минуты 27 секунд)
   Post subject:
Reply with quote

Квадратичные уравнения всегда имеют 2 корня
-- D > 0: x1, x2 - вещественные числа
-- D = 0: x1, x2 - вырожденный случай, равенства двух корней
-- D < 0: x1, x2 - комплексные числа вида (x+iy), где i^2 = -1

Второе замечание - решалка реализована для частного случая целочисленных неотрицательных коэффициентов
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Thu May 28, 2009 8:08 pm (спустя 7 минут; написано за 10 секунд)
   Post subject:
Reply with quote

И третье - алгоритм неверен!!!
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 197
   поощрить/наказать

Location: 007 495

PostPosted: Thu May 28, 2009 11:26 pm (спустя 3 часа 17 минут; написано за 8 минут 38 секунд)
   Post subject:
Reply with quote

Александр Михалицын
Я думаю, более корректно примерно такое:
Code (JavaScript): скопировать код в буфер обмена
var sq_eq_solver = {

    /*
     
    a*x^2 + b*x + c = 0

    returns:
        [ [Re x1,Im x1], [Re x2,Im x2] ] for a!=0
        [ x ] for a==0, b!=0
        boolean for a==0 and b==0
   
    */


    solve: function(a,b,c)
    {
        if(!a) return b ? [-c/b] : !c;
       
        // scale coeffs so, that a=0.5 and x1,x2 = ( -b +- sqrt(D) ); ( 1/2a == 1)
        b/=2*a; c/=2*a; a=0.5;
        var D = b*b - 2*c;
        var sqD = Math.sqrt(Math.abs(D));
       
        if(D >= 0) return [[-b+sqD,0],[-b-sqD,0]];
        return [[-b,sqD],[-b,-sqD]];
    }

};
Оно не парсит строчку (ИМХО здесь это не нужно) и корректно обрабатывает случаи с комплексными корнями. Также учитывает возможность указания a=0 и b=0. Тем не менее, комлексные коэффициенты оно не обрабатывает (хотя, если хочется, это очень легко поправить).

Last edited by Юрий Насретдинов on Thu May 28, 2009 11:57 pm; edited 6 times in total
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 197
   поощрить/наказать

Location: 007 495

PostPosted: Fri May 29, 2009 1:01 am (спустя 1 час 35 минут; написано за 2 минуты 10 секунд)
   Post subject:
Reply with quote

Гхм, наверное я немного погорячился насчет того, что решение квадратного уравнения с комплексными коэффициентами ненамного сложнее :). Вот код, который должен решать квадратное уравнение с комплексными коэффициентами (могут быть ошибки, поскольку я проверил его всего для 3х довольно простеньких уравнений):
Code (JavaScript): скопировать код в буфер обмена
var sq_eq_solver = {

    /*
     
    a*x^2 + b*x + c = 0

    returns:
        [ [Re x1,Im x1], [Re x2,Im x2] ] for a!=0
        [ x ] for a==0, b!=0
        boolean for a==0 and b==0
   
    */


    solve: function(a,b,c)
    {
        if(!a) return b ? [-c/b] : !c;
       
        // scale coeffs so, that a=0.5 and x1,x2 = ( -b +- sqrt(D) ); ( 1/2a == 1)
        b/=2*a; c/=2*a; a=0.5;
        var D = b*b - 2*c;
        var sqD = Math.sqrt(Math.abs(D));
       
        if(D >= 0) return [[-b+sqD,0],[-b-sqD,0]];
        return [[-b,sqD],[-b,-sqD]];
    },
   
    // pretty much the same as solve, but arguments are in another format:
    // a = [Re a, Im a], b = [ Re b, Im b ], c = [ Re c, Im c ]
    //
    // another difference -- if a==0,b!=0 the answer is returned in format [ [Re x, Im x] ]
   
    solve_c: function(a,b,c)
    {
        if(!a[0] && !a[1]) return b[0]&&b[1] ? [this._neg(this._div(c,b))] : !c[0]&&!c[1];
       
        // scale coeffs so, that a=0.5 and x1,x2 = ( -b +- sqrt(D) ); ( 1/2a == 1)
        var two_a_i = this._div([0.5,0],a); // 1/2a
       
        a=[0.5,0];
        b=this._mul(b,two_a_i); // b = b*(1/2a)
        c=this._mul(c,two_a_i); // c = c*(1/2a)
       
        var D = this._sub( this._mul(b,b), this._mul([2,0],c) ); // var D = b*b - 2*c;
        var sqD = this._sqrt(D);
       
        var nb = this._neg(b);
        return [ this._sum(nb,sqD), this._sub(nb,sqD)];
    },
   
    // complex multiplication
   
    _mul: function(a,b)
    {
        return [ a[0]*b[0] - a[1]*b[1], a[1]*b[0] + b[1]*a[0] ]
    },
   
    // complex division: returns (a/b)
   
    _div: function(a,b)
    {
        // a/b = a*(b*)/|b|^2, where b* = Re b - i*Im b
       
        var b2 = b[0]*b[0] + b[1]*b[1]; // (|b|^2)
        if(!b2) return false;
       
        b[0] /= b2; b[1] /= -b2; // note that we need to take b*, not b
       
        return this._mul(a,b);
    },
   
    _sum: function(a,b)
    {
        return [ a[0]+b[0],a[1]+b[1] ];
    },
   
    // a - b
    _sub: function(a,b)
    {
        return [ a[0]-b[0], a[1]-b[1] ];
    },
   
    _neg: function(a)
    {
        return [ -a[0],-a[1] ];
    },
   
    // so...
    // sqrt(a) = sqrt(|a| * exp(i*Arg(a))) = +-sqrt(|a|) * exp(i*Arg(a)/2) (1)
    // Arg(a) = +- atan(Im a / Re a) = atan2(Im a, Re a)
    //
    // NOTE: in this particular case only value with "+" for formula (1) is taken
    // return value is _one_ complex number
   
    _sqrt: function(a)
    {
        // get the exponential form of an answer
        var r = Math.sqrt( a[0]*a[0] + a[1]*a[1] );
        if(r==0) return [0,0];
       
        r = Math.sqrt(r);
        var phi = Math.atan2(a[1],a[0])/2;
        // exp(i*phi) = cos(phi) + i*sin(phi)
        return [ r*Math.cos(phi), r*Math.sin(phi) ];
    }

};

// should be ( -4 - i ), ( 2i )
alert( sq_eq_solver.solve_c([2,0],[-8,-6],[-4,16]) );
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Fri May 29, 2009 5:28 am (спустя 4 часа 26 минут; написано за 49 секунд)
   Post subject:
Reply with quote

Rumata,
это решалка написана учеником 8го класса (тобишь мной), я еще не работал с комплексными числами
поэтому и написал её так, как мы решали в школе...
Quote:
Второе замечание - решалка реализована для частного случая целочисленных неотрицательных коэффициентов
Это будет сделано...
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Fri May 29, 2009 9:31 am (спустя 4 часа 2 минуты; написано за 3 минуты 7 секунд)
   Post subject:
Reply with quote

Александр Михалицын wrote:
я еще не работал с комплексными числами
Упс. Виноват. Тем не менее остальные замечания остаются в силе. Юрий прав, парсить строку и решать уравнение - две разные задачи, не стоит их сливать в один объект. Лучше передавать коэффициенты массивом или списком аргументов.
Юрий Насретдинов wrote:
наверное я немного погорячился насчет того, что решение квадратного уравнения с комплексными коэффициентами ненамного сложнее
В действительности оно должно быть не сложнее после определения класса комплексных чисел (-:
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Fri May 29, 2009 10:02 am (спустя 31 минуту; написано за 53 секунды)
   Post subject:
Reply with quote

Rumata,
Quote:
парсить строку и решать уравнение - две разные задачи,
Ага. Я еще когда писал задумался об этом... Но тем не менее написал именно так...
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 197
   поощрить/наказать

Location: 007 495

PostPosted: Fri May 29, 2009 4:18 pm (спустя 6 часов 15 минут; написано за 51 секунду)
   Post subject:
Reply with quote

Александр Михалицын
Саш, в любом случае, делить на 2a надо уметь правильно. Попробуй задать ей уравнение "2x^2 + 2" и ужаснуться результату.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 197
   поощрить/наказать

Location: 007 495

PostPosted: Fri May 29, 2009 4:20 pm (спустя 2 минуты; написано за 1 минуту 54 секунды)
   Post subject:
Reply with quote

Rumata wrote:
В действительности оно должно быть не сложнее после определения класса комплексных чисел (-:
В C++ да, а вот в Javascript, кажется, нельзя переопределять операторы. К тому же, я фактически и реализовал этот класс, написав «с нуля» несколько нужных для решения задач методов, в том числе извлечение корня из комплексного числа (лично мы это проходили в курсе ТФКП на третьем курсе :)).
Back to top
View user's profile Send private message Send e-mail
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Fri May 29, 2009 4:40 pm (спустя 19 минут; написано за 2 минуты 20 секунд)
   Post subject:
Reply with quote

Quote:
лично мы это проходили в курсе ТФКП на третьем курсе :))
я Вас прошу :) как все страшно... ТФКП, третий курс... даже с учетом того, что мои личные воспоминания об этом курсе вообще и предмете в частности весьма смутные, никто не отменял вот это: tinyurl.com/lungdd
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Fri May 29, 2009 4:42 pm (спустя 1 минуту 56 секунд; написано за 1 минуту 32 секунды)
   Post subject:
Reply with quote

Quote:
Саш, в любом случае, делить на 2a надо уметь правильно. Попробуй задать ей уравнение "2x^2 + 2" и ужаснуться результату.
гы -)
Quote:
В C++ да, а вот в Javascript, кажется, нельзя переопределять операторы. К тому же, я фактически и реализовал этот класс, написав «с нуля» несколько нужных для решения задач методов, в том числе извлечение корня из комплексного числа (лично мы это проходили в курсе ТФКП на третьем курсе :)).
А теперь, если ты каждый метод опишешь (как он работает) будет вообще супер. =)
Мне интересно значть что вы тм в ТФКП проходили... =)
Code (JavaScript): скопировать код в буфер обмена
var qrt_equation_solver =
{
        evalute_D: function(a, b, c)
        {
                return b * b - 4 * a * c;
        },

        find_x1: function(a, b, D)
        {
                return (-1 * b + Math.sqrt(D)) / (2 * a);
        },

        find_x2: function(a, b, D)
        {
                return (-1 * b - Math.sqrt(D)) / (2 * a);
        },

        solve: function(abc)
        {
                if (abc.a === 0)
                {
                        throw new Error('    a     .');
                }

                var D = this.evalute_D(abc.a, abc.b, abc.c);

                if (D > 0)
                {
                        var x1 = this.find_x1(abc.a, abc.b, D);
                        var x2 = this.find_x2(abc.a, abc.b, D);
                } else if (D == 0) {
                        var x1 = this.find_x1(abc.a, abc.b, D);
                        var x2 = ' ';
                } else {
                        var x1 = ' ';
                        var x2 = ' ';
                }

                return '(' + x1 + ';' + x2 + ')';
        }
}

alert(qrt_equation_solver.solve({
        'a': 1,
        'b': -5,
        'c': 3
}));


Last edited by Александр Михалицын on Fri May 29, 2009 5:17 pm; edited 3 times in total
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Mon Jun 08, 2009 10:31 am (спустя 9 дней 17 часов 49 минут; написано за 42 секунды)
   Post subject:
Reply with quote


М

Тему порезал.
Обсуждение классов комплексных чисел тут (forum.dklab.ru/viewtopic.php?t=34336)
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML