Solve() gives wrong answer (r10077)
|
04-27-2016, 09:47 AM
Post: #1
|
|||
|
|||
Solve() gives wrong answer (r10077)
Hi,
this is probably a stupid question but why does not the following equation give me an answer? Solve(0.04*x^2-2.4*x+36=0) Prime answers [[]] Solving it on paper gives x=30 Wolfram Alpha solves this just fine Thanks |
|||
04-27-2016, 01:16 PM
Post: #2
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
(04-27-2016 09:47 AM)drkosse Wrote: Hi, It's a rounding problem. The exact equation has two equal real roots which the CAS finds perfectly well with 4/100 and 24/10 in place of 0.04 and 2.4. With the approximate numbers in place I'm assuming that b^2-4*a*c is - just! - negative and so no real root exists. Keeping the approximate numbers and changing 36 to 35.99999999 also works, as does using csolve instead of solve. What is more annoying is that taking the equation 0.04*x^2-2.4*x+30=0 (which has two real roots that solve finds without difficulty) and multiplying each term by 1e-16 produces an equation that solve (or fsolve or csolve) won't solve. The CAS has a particular aversion to small approximate numbers which other systems do not share. As a physicist I find this frustrating, although once aware of the problem there are work-arounds. Nigel (UK) |
|||
04-27-2016, 01:48 PM
Post: #3
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
The CAS uses base-2 representation for numbers for speed. However, this also means that floating point calculations are seemingly inaccurate for many cases (what you see is not what you get) because there are certain decimal values that cannot be represented exactly using the base-2 representation (as an example: 0.2). I believe this is not an issue with BCD representations. What you see is in fact what you get.
http://www-fourier.ujf-grenoble.fr/~pari...n/#htoc558 https://users.cs.duke.edu/~raw/cps104/TW...ating.html Converting all non-integer values to their rational form, however, will fix this issue if you insist on using the solve() command. The solve() command attempts to solve equations exactly and will return an empty list if it cannot. Using fsolve() in the case of "approximate" expressions should, however, give the correct (approximate) solution. Graph 3D | QPI | SolveSys |
|||
04-27-2016, 02:14 PM
Post: #4
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
The majority of my regressions tests are with exact data, this explains these kinds of quirks. I believe I can fix
Code: fsolve(0.04e-16*x^2-2.4e-16*x+30e-16); For the other example, it's intrinsically not possible to solve it, as explained by Han. Binary floats can only represent exactly rationals with a denominator dividing a power of 2, that's not the case for 0.04=1/25, therefore rounding errors might transform a 0 discriminant to something negative. csolve will return complex roots in this situation. |
|||
04-27-2016, 02:19 PM
(This post was last modified: 04-27-2016 02:20 PM by toml_12953.)
Post: #5
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
(04-27-2016 01:16 PM)Nigel (UK) Wrote:(04-27-2016 09:47 AM)drkosse Wrote: Hi, csolve gets {30-5.96046447754E-6*i,30+5.96046447754E-6*i} Tom L[/b] Tom L Cui bono? |
|||
04-27-2016, 04:16 PM
Post: #6
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
solve(4/100*x^2-24/10*x+36=0,x) returns {30}
|
|||
04-27-2016, 04:20 PM
Post: #7
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
Ok, so I will simply convert the decimals to ratios (manually or with function exact()) and then use solve(), like:
solve(1/25*x^2-12/5*x+36=0) which gives {30} Thank you all for the explanations |
|||
04-28-2016, 03:24 AM
Post: #8
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
(04-27-2016 01:16 PM)Nigel (UK) Wrote: ...I find this frustrating, although once aware of the problem there are work-arounds. I totally agree with you Success is the ability to go from one failure to the next without any loss of enthusiasm. View PNG/JPG in your Prime |
|||
04-28-2016, 04:52 AM
Post: #9
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
Please add a note about this problem to the calculators help file, Thank You.
|
|||
04-28-2016, 06:54 AM
Post: #10
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
Same problem with proot([0.04,-2.4,36])
the answer is [30-2.107e6i 30+2.107e-6i] so we have an error in the order of 1e-6 with thew first coefficient in the order of 1e-2. I find this error very big, also considering binary approximation. |
|||
04-28-2016, 09:11 AM
Post: #11
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
(04-28-2016 06:54 AM)retoa Wrote: Same problem with proot([0.04,-2.4,36]) Actually, this error is about the correct size. It comes from \( b^2-4ac \) being very slightly negative instead of zero. If \( b^2-4ac=-\epsilon \) then the imaginary part of the roots is \( \pm{\rm i}\sqrt\epsilon/2a \) and an error of \( \sim10^{-6} \) is understandable if \( \epsilon\sim10^{-12} \). Nigel (UK) |
|||
04-28-2016, 12:34 PM
(This post was last modified: 04-28-2016 12:59 PM by informach.)
Post: #12
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
Hi!:
This equation, is very easy, for Solve. 1) Press App. 2) Select Solve. 3) Write, the equation, in E1. 4) Press, Num and Solve. 5) You can see, the result. Note: See, the images and comparison, with Wolfram Alpha. Kind Regards. informach. |
|||
04-28-2016, 12:55 PM
Post: #13
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
(04-28-2016 12:34 PM)informach Wrote: Hi!: The problem is not with the Solve App, it's with the solve command in CAS |
|||
04-28-2016, 01:11 PM
(This post was last modified: 04-28-2016 01:33 PM by informach.)
Post: #14
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
Hi!, retoa:
Don't worry !. Be Happy !. Kind Regards. informach. |
|||
04-28-2016, 02:23 PM
(This post was last modified: 04-28-2016 02:24 PM by retoa.)
Post: #15
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
(04-28-2016 01:11 PM)informach Wrote: Hi!, retoa: Hi informarch, this is not new, it was already proposed yesterday by drkosse and it obviously works as you don't have any binary approximation. The problem comes only if you use solve() or proot() with approximated values. Please read the whole thread. No problem with integers, nor with fractions. |
|||
04-28-2016, 02:34 PM
Post: #16
|
|||
|
|||
RE: Solve() gives wrong answer (r10077)
For the [CAS] solve(0.04*x^2-2.4*x+36 = 0) test case:
When only the first coefficient is exact: solve(1/25*x^2-2.4*x+36 = 0,x) ==> {30} When only the second coefficient is exact: solve(0.04*x^2-12/5*x+36 = 0,x) ==> {30,30} -Dale- |
|||
« Next Oldest | Next Newest »
|
User(s) browsing this thread: 5 Guest(s)