(12C Platinum) Zero of Function - Printable Version +- HP Forums (https://www.hpmuseum.org/forum) +-- Forum: HP Software Libraries (/forum-10.html) +--- Forum: General Software Library (/forum-13.html) +--- Thread: (12C Platinum) Zero of Function (/thread-12344.html) |
(12C Platinum) Zero of Function - Gamo - 02-03-2019 10:34 AM ALG mode program for Secant Method Solution to f(x)=0 This program is very small and easy to use. User need to give a very close pair of educated guess nearest to the root. Remark: This program don't have the tolerance setup but used the iteration counter instead. The default counter is 65 Counter can be change on line 002 using two steps 50, 75, 90, etc. ------------------------------------------------------- Procedure: Start f(x) at line 022 and end GTO 008 1. First Guess [R/S] ... display # of iteration counter 2. Second Guess ... display Answer --------------------------------------------------------- Example: FIX 4 x^3 + x^2 + x - 2 = 0 Insert Equation at line 022 [RCL] 1 [Y^X] 3 [+] [RCL] 1 [X^2] [+] [RCL] 1 [-] 2 [=] [GTO] 008 First guess 3 [R/S] display 65 Second guess 1 [R/S] display...........0.8105 Root = 0.8105 ------------------------------------------------------ LN(x) + 3(x) - 10.8074 Insert Equation at line 022 [RCL] 1 [LN] + ([RCL]1 [x] 3) [-] 10.8074 [=] [GTO] 008 First guess 4 [R/S] display 65 Second guess 2 [R/S] display...........3.2134 ------------------------------------------------------- Program: ALG Mode Quote:[STO] 0 65 [STO] 2 [R/S] [STO] 1 Remark: This is not a perfect program, use at your own risk. Any improvement is welcome for ALG programming mode only. Gamo RE: (12C Platinum) Secant Method - Albert Chan - 02-03-2019 01:31 PM Hi, Gamo I thought Secant's method required 2 points, thus 4 variables: (x0, f0), (x1,f1) Interpolate the line to (x2, 0): Slope = (f1-f0)/(x1-x0) = (f1-0)/(x1-x2) --> x2 = x1 - f1/(f1-f0) * (x1-x0) The method only use the most recent 2 points. There should be some updates: x0,f0,x1,f1 = x1,f1,x2,f(x2) For your code, I did not see f0 anywhere. Also, your code seems to start the equation at line 023. RE: (12C Platinum) Secant Method - Dieter - 02-03-2019 05:57 PM (02-03-2019 01:31 PM)Albert Chan Wrote: I thought Secant's method required 2 points, thus 4 variables: (x0, f0), (x1,f1) Take a look at the code and see what it does:
The choice of a is crucial as it decides whether the iteration will converge at all. It doesn't matter if a is greater or less than b (which can be shown easily). The iteration may converge, diverge or oscillate between different values. As a rough rule the value of a should be close to the slope (!) of the function near the root, and b should be close to the root itself. Again: only b is a guess for the root, but a isn't. Consider the first example x³+x²+x–2 = 0. There is a root at ≈0,81. At this root the slope (derivative) is ≈4,6. At the initial guess b=1 the derivative is 6. So values for a in this range, say 4...6, will make the iteration converge well, similar to Newton's method. Now try a=2 and b=1. The iteration does not converge and will finally oscillate between approx. 0,3 and 1,09. Then try a=–1 and b=1. The iteration will diverge towards infinity (eventually causing an overflow error). So this method only works under some exactly defined conditions. Or, as Gamo put it: (02-03-2019 10:34 AM)Gamo Wrote: This is not a perfect program, use at your own risk. ;-) Edit: here is another version of Gamo's program that might be more clear: Code: 001 STO 0 Dieter RE: (12C Platinum) Secant Method - Gamo - 02-04-2019 01:00 AM Thanks to Albert Chan and Dieter for the review. Dieter program suggestion is more refine and more clear. -------------------------------------------------------------- I have try my original program for X^X = Y equation for X^X = 1000 Using this formula: LN(x) * (x) - LN(y) f(x) equation start line 022 and store 1000 in R5 [RCL] 1 [LN] [x] [RCL] 1 [-] ([RCL] 5 [LN]) [=] [GTO] 008 1000 [STO] 5 First Guess: 6 [R/S] display 65 Second Guess: 4 [R/S] display 4.5555 Fix 9 display 4.555535705 Not bad for when using a good guess. Gamo RE: (12C Platinum) Zero of Function - Dieter - 02-04-2019 05:19 PM (02-04-2019 01:00 AM)Gamo Wrote: Dieter program suggestion is more refine and more clear. The clarity essentially is in the formatting. Use line numbers, one command per line, and you will also detect possible errors. For instance that f(x) does not start on line 022 (which is GTO 000) but line 023. (02-04-2019 01:00 AM)Gamo Wrote: First Guess: 6 [R/S] display 65 As already explained, the two inputs are not two guesses for the root. Only the second value (I called it "b") is an estimate, while the first one (I called it "a") is not. Still not convinced? Then try this: f(x) = 1000·x – 2000 = 0 There obviously is a root at x=2. If you think that the two input values are two guesses, try 3 and 1. Result: this will not converge, the iteration finally oscillates between plus and minus infinity. Then try 3000 (!) and 1. This will eventually converge to the correct result x=2. Try 1000 and 1, 100, 4711 or whatever, and the root is instantly found in the first iteration. The first input "a" is not a guess for the root. It is a slope (!) that determines how fast the iteration converges – if at all. In the above example f'(x) = 1000 (constant), so the iteration directly returns the root. To be honest, I don't think that this method is a good one for solving functions. Its essential advantage is its simplicity that requires just one function call – which is nice for calculators without subroutines. If one wants to try this approach it is recommended to choose the first input close to the function's derivative at the root, and the second input (the guess) should be close to root itself. Consider your last example: f(x) = x · ln(x) – ln(1000) Let's start with a quite rough guess: the solution is somewhere between 1 and 10. The derivative for these values falls between 1 and ~3,3. So let's choose 2 as the first input. The second input, i.e. the initial guess, may be any positive value up to about 12, and the iteration will converge to the true root. It doesn't matter whether you enter 0,001 or 2 or 4,5 or 8 or 12 here. All these initial guesses will equally converge within roughly twenty iterations. (02-04-2019 01:00 AM)Gamo Wrote: Not bad for when using a good guess. As shown, the initial guess is not that crucial; it's the first input, the slope, that decides whether the whole thing will work or not. If you choose 2,5 here (which is f'(4,55) it only takes a few iterations until the root is found – for any positive guess up to about 17. Dieter |