As solving an equation is basically giving the set of its solutions, I prefer to use a set to solve the equation.Instead of the OrederedCollection of course. It simplifies the algorithm if the discriminant is 0, because adding two times the same root yields a set with only one element, not the same element counted twice. The algorithm (much like the one with ordered collection) goes like this: *create an empty set with Set new. *compute the discriminant. *if it is positive, add to the set the "two" roots. *you're done! On Wed, Apr 2, 2014 at 8:45 PM, nacho <0800nacho@gmail.com> wrote:
Hi Nacho,
I wouldn't throw an error because otherwise one must know beforehand that an equation is non-resolvable or must use #on:do: everywhere. Since that when you ask to resolve an equation you get back a collection of solutions, a non-resolvable equation could just return an empty collection, couldn't it?. If you really want to consider that asking to resolve a non-resolvable equation is an error, another solution would be to provide a #rootsIfNone: method. That's a common pattern in Smalltalk. I would also rename 'checkNegative' to 'discriminant', because it's not obvious to see what that variable represents at first glance.
Very good points. I came up with a third draft. This is evolving good! Thanks Nacho
"The idea is to have a class to calculate quadratic equations. This second third still only calculates real roots (leaving aside imaginary roots). But thanks to Damien Cassou, and Camille Teruel has a better style.
A QuadraticEquation is a class used to solve Quadratic Equations of the form: ax^2 + bx + c = 0, where a is not 0.
You can set the coefficients using the following method setQuadraticCoefficient: linearCoefficient: constant:"
Object subclass: #QuadraticEquation instanceVariableNames: 'quadraticCoefficient linearCoefficient constant roots' classVariableNames: '' category: 'IS-Math'
"I create accessors (only getters for each term) and then the following method to set the terms" setQuadraticCoefficient: aNumber1 linearCoefficient: aNumber2 constant: aNumber3 quadraticCoefficient := aNumber1. linearCoefficient := aNumber2. constant := aNumber3
QuadraticEquation>>calculateRoots | discriminant | discriminant := linearCoefficient squared - ( 4 * quadraticCoefficient * constant).
discriminant >= 0 ifFalse: [ ^ self rootsIfNone ] ifTrue: [ ^ self solveRoots: discriminant]
QuadraticEquation>>solveRoots: aTerm | rootA rootB | roots := OrderedCollection new. rootA := (linearCoefficient negated + aTerm sqrt) / (2 * quadraticCoefficient). rootB := (linearCoefficient negated - aTerm sqrt) / (2 * quadraticCoefficient). roots add: rootA; add: rootB. ^ roots
QuadraticEquation>>rootsIfNone ^ 'No real solution for the equation'
" Example: -3x^2+2x+2=0 an OrderedCollection(-0.5485837703548636 1.2152504370215302)
print(it)
| anEquation | anEquation := QuadraticEquation new. anEquation setQuadraticCoefficient: -3 linearCoefficient: 2 constant: 2. anEquation calculateRoots."
----- Nacho Smalltalker apprentice. Buenos Aires, Argentina. -- View this message in context: http://forum.world.st/Question-on-style-tp4752165p4752369.html Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.