| Line | |
|---|
| 1 |
-- bisection method for solving non-linear equations |
|---|
| 2 |
|
|---|
| 3 |
delta=1e-6 -- tolerance |
|---|
| 4 |
|
|---|
| 5 |
function bisect(f,a,b,fa,fb) |
|---|
| 6 |
local c=(a+b)/2 |
|---|
| 7 |
io.write(n," c=",c," a=",a," b=",b,"\n") |
|---|
| 8 |
if c==a or c==b or math.abs(a-b)<delta then return c,b-a end |
|---|
| 9 |
n=n+1 |
|---|
| 10 |
local fc=f(c) |
|---|
| 11 |
if fa*fc<0 then return bisect(f,a,c,fa,fc) else return bisect(f,c,b,fc,fb) end |
|---|
| 12 |
end |
|---|
| 13 |
|
|---|
| 14 |
-- find root of f in the inverval [a,b]. needs f(a)*f(b)<0 |
|---|
| 15 |
function solve(f,a,b) |
|---|
| 16 |
n=0 |
|---|
| 17 |
local z,e=bisect(f,a,b,f(a),f(b)) |
|---|
| 18 |
io.write(string.format("after %d steps, root is %.17g with error %.1e, f=%.1e\n",n,z,e,f(z))) |
|---|
| 19 |
end |
|---|
| 20 |
|
|---|
| 21 |
-- our function |
|---|
| 22 |
function f(x) |
|---|
| 23 |
return x*x*x-x-1 |
|---|
| 24 |
end |
|---|
| 25 |
|
|---|
| 26 |
-- find zero in [1,2] |
|---|
| 27 |
solve(f,1,2) |
|---|