50 lines
1.4 KiB
Text
50 lines
1.4 KiB
Text
#Include "crt.bi"
|
|
const iterations=20000000
|
|
|
|
sub bisect( f1 as function(as double) as double,min as double,max as double,byref O as double,a() as double)
|
|
dim as double last,st=(max-min)/iterations,v
|
|
for n as double=min to max step st
|
|
v=f1(n)
|
|
if sgn(v)<>sgn(last) then
|
|
redim preserve a(1 to ubound(a)+1)
|
|
a(ubound(a))=n
|
|
O=n+st:exit sub
|
|
end if
|
|
last=v
|
|
next
|
|
end sub
|
|
|
|
function roots(f1 as function(as double) as double,min as double,max as double, a() as double) as long
|
|
redim a(0)
|
|
dim as double last,O,st=(max-min)/iterations,v
|
|
for n as double=min to max step st
|
|
v=f1(n)
|
|
if sgn(v)<>sgn(last) and n>min then bisect(f1,n-st,n,O,a()):n=O
|
|
last=v
|
|
next
|
|
return ubound(a)
|
|
end function
|
|
|
|
Function CRound(Byval x As Double,Byval precision As Integer=30) As String
|
|
If precision>30 Then precision=30
|
|
Dim As zstring * 40 z:Var s="%." &str(Abs(precision)) &"f"
|
|
sprintf(z,s,x)
|
|
If Val(z) Then Return Rtrim(Rtrim(z,"0"),".")Else Return "0"
|
|
End Function
|
|
|
|
function defn(x as double) as double
|
|
return x^3-3*x^2+2*x
|
|
end function
|
|
|
|
redim as double r()
|
|
|
|
print
|
|
if roots(@defn,-20,20,r()) then
|
|
print "in range -20 to 20"
|
|
print "All roots approximate"
|
|
print "number","root to 6 dec places","function value at root"
|
|
for n as long=1 to ubound(r)
|
|
print n,CRound(r(n),6),,defn(r(n))
|
|
next n
|
|
end if
|
|
sleep
|