Author |
Message |
Александр Михалицын
Модератор
Joined: 23 May 2008
Posts: 1299
Карма: 83 поощрить/наказать
|
Posted: Thu May 28, 2009 7:17 pm (написано за 4 минуты 4 секунды)
Post subject: "Решалка" квадратичных уравнений
|
|
Что-то сегодня захотелось мне её написать и я написал... =) Вобщем, она разбирает квадратичные уравнение в стандартном виде многочлена (не требующем упрощения, а также с наибольшей степенью, стоящей спереди). Вторая степень обозначается "^2" (да-да я знаю что это не знак степени, но ничего другого в голову не пришло...). Код ниже, пример тоже... Еще я писал "строилку" графиков функций... =) Это тоже потом выложу... ;) Специально для школьников, которые вдруг забретут на этот форум, в поисках ГДЗ или чего-то подобного... =) Вам лучше не пользоваться этой штукой, а научится решать эти уравнения самим... =)
см. код ниже.
Last edited by Александр Михалицын on Fri May 29, 2009 4:51 pm; edited 1 time in total
|
|
Back to top |
|
 |
Rumata
Профессионал

Joined: 17 Aug 2003
Posts: 1850
Карма: 185 поощрить/наказать
|
Posted: Thu May 28, 2009 8:00 pm (спустя 43 минуты; написано за 3 минуты 27 секунд)
Post subject:
|
|
Квадратичные уравнения всегда имеют 2 корня -- D > 0: x1, x2 - вещественные числа -- D = 0: x1, x2 - вырожденный случай, равенства двух корней -- D < 0: x1, x2 - комплексные числа вида (x+iy), где i^2 = -1 Второе замечание - решалка реализована для частного случая целочисленных неотрицательных коэффициентов
|
|
Back to top |
|
 |
Rumata
Профессионал

Joined: 17 Aug 2003
Posts: 1850
Карма: 185 поощрить/наказать
|
Posted: Thu May 28, 2009 8:08 pm (спустя 7 минут; написано за 10 секунд)
Post subject:
|
|
И третье - алгоритм неверен!!!
|
|
Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8642
Карма: 197 поощрить/наказать
Location: 007 495
|
Posted: Thu May 28, 2009 11:26 pm (спустя 3 часа 17 минут; написано за 8 минут 38 секунд)
Post subject:
|
|
Александр Михалицын
Я думаю, более корректно примерно такое: 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 |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8642
Карма: 197 поощрить/наказать
Location: 007 495
|
Posted: Fri May 29, 2009 1:01 am (спустя 1 час 35 минут; написано за 2 минуты 10 секунд)
Post subject:
|
|
Гхм, наверное я немного погорячился насчет того, что решение квадратного уравнения с комплексными коэффициентами ненамного сложнее :). Вот код, который должен решать квадратное уравнение с комплексными коэффициентами (могут быть ошибки, поскольку я проверил его всего для 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 |
|
 |
Александр Михалицын
Модератор
Joined: 23 May 2008
Posts: 1299
Карма: 83 поощрить/наказать
|
Posted: Fri May 29, 2009 5:28 am (спустя 4 часа 26 минут; написано за 49 секунд)
Post subject:
|
|
Rumata, это решалка написана учеником 8го класса (тобишь мной), я еще не работал с комплексными числами поэтому и написал её так, как мы решали в школе... Quote: |
Второе замечание - решалка реализована для частного случая целочисленных неотрицательных коэффициентов | Это будет сделано...
|
|
Back to top |
|
 |
Rumata
Профессионал

Joined: 17 Aug 2003
Posts: 1850
Карма: 185 поощрить/наказать
|
Posted: Fri May 29, 2009 9:31 am (спустя 4 часа 2 минуты; написано за 3 минуты 7 секунд)
Post subject:
|
|
Александр Михалицын wrote: |
я еще не работал с комплексными числами | Упс. Виноват. Тем не менее остальные замечания остаются в силе. Юрий прав, парсить строку и решать уравнение - две разные задачи, не стоит их сливать в один объект. Лучше передавать коэффициенты массивом или списком аргументов. Юрий Насретдинов wrote: |
наверное я немного погорячился насчет того, что решение квадратного уравнения с комплексными коэффициентами ненамного сложнее | В действительности оно должно быть не сложнее после определения класса комплексных чисел (-:
|
|
Back to top |
|
 |
Александр Михалицын
Модератор
Joined: 23 May 2008
Posts: 1299
Карма: 83 поощрить/наказать
|
Posted: Fri May 29, 2009 10:02 am (спустя 31 минуту; написано за 53 секунды)
Post subject:
|
|
Rumata, Quote: |
парсить строку и решать уравнение - две разные задачи, | Ага. Я еще когда писал задумался об этом... Но тем не менее написал именно так...
|
|
Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8642
Карма: 197 поощрить/наказать
Location: 007 495
|
Posted: Fri May 29, 2009 4:18 pm (спустя 6 часов 15 минут; написано за 51 секунду)
Post subject:
|
|
Александр Михалицын
Саш, в любом случае, делить на 2a надо уметь правильно. Попробуй задать ей уравнение "2x^2 + 2" и ужаснуться результату.
|
|
Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8642
Карма: 197 поощрить/наказать
Location: 007 495
|
Posted: Fri May 29, 2009 4:20 pm (спустя 2 минуты; написано за 1 минуту 54 секунды)
Post subject:
|
|
Rumata wrote: |
В действительности оно должно быть не сложнее после определения класса комплексных чисел (-: | В C++ да, а вот в Javascript, кажется, нельзя переопределять операторы. К тому же, я фактически и реализовал этот класс, написав «с нуля» несколько нужных для решения задач методов, в том числе извлечение корня из комплексного числа (лично мы это проходили в курсе ТФКП на третьем курсе :)).
|
|
Back to top |
|
 |
dimagolov
Участник форума
Joined: 04 Feb 2007
Posts: 1664
Карма: 96 поощрить/наказать
Location: Christ Church, Barbados
|
Posted: Fri May 29, 2009 4:40 pm (спустя 19 минут; написано за 2 минуты 20 секунд)
Post subject:
|
|
Quote: |
лично мы это проходили в курсе ТФКП на третьем курсе :)) | я Вас прошу :) как все страшно... ТФКП, третий курс... даже с учетом того, что мои личные воспоминания об этом курсе вообще и предмете в частности весьма смутные, никто не отменял вот это: tinyurl.com/lungdd
|
|
Back to top |
|
 |
Александр Михалицын
Модератор
Joined: 23 May 2008
Posts: 1299
Карма: 83 поощрить/наказать
|
Posted: Fri May 29, 2009 4:42 pm (спустя 1 минуту 56 секунд; написано за 1 минуту 32 секунды)
Post subject:
|
|
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 |
|
 |
Александр Михалицын
Модератор
Joined: 23 May 2008
Posts: 1299
Карма: 83 поощрить/наказать
|
Posted: Mon Jun 08, 2009 10:31 am (спустя 9 дней 17 часов 49 минут; написано за 42 секунды)
Post subject:
|
|
 М |
| Тему порезал. Обсуждение классов комплексных чисел тут (forum.dklab.ru/viewtopic.php?t=34336) |
|
|
Back to top |
|
 |
|