REM Start of BASIC! Program
REM Determinação dos zeros de uma função – Método de Newton Raphson
REM primeiro,determinam-se valores aproximados dos zeros; pode ser por cálculo exaustivo entre dois limites definidos ou por visualização gráfica.
FN.DEF funcao (x)
func = 2*x^2-3*x-8
FN.RTN func
FN.END
LIST.CREATE n, zeros
REM Traçado do Sistema de Eixos Ortogonais
GR.OPEN
GR.ORIENTATION 1
GR.TEXT.SIZE 45
GR.COLOR, 255,0,0
GR.LINE c1, 525,500,525,1500
GR.LINE c2, 0,1000,1050,1000
GR.RENDER
GR.COLOR, 0,0,255
GR.TEXT.DRAW c0, 130,200, “CÁLCULO DOS ZEROS DE UMA FUNÇÃO”
GR.COLOR, 255,0,0
GR.TEXT.DRAW c7, 320,270,”f= 2*x^2 – 3*x – 4″
GR.TEXT.DRAW c8, 80,350,”Pode substituir a função por outra à sua escolha”
GR.RENDER
GR.COLOR, 0,0,0
GR.TEXT.SIZE 25
REM Coordenadas do Eixo Horizontal
FOR i = -5 TO 5 STEP 1
fx=525/5
x_med=525
i$=STR$(i)
IF i<0 THEN xg=x_med-fx*ABS(i)
IF i>=0 THEN xg=x_med+fx*ABS(i)
GR.TEXT.DRAW c4, xg,1030,STR$(i)
GR.RENDER
NEXT i
REM Cálculo dos zeros aproximados
h=0.005
y_max=-10000
y_zero=10
y_zero_ant=10
zero=0
FOR i = -5 TO 5 STEP h
y = funcao (i)
PRINT “x= “;i, “y= “;y
rem o eps não pode ser muito baixo, senão pode deixar escapar alguma solução
IF abs (y) < 0.1 & abs (y) <y_zero
y_zero_ant= abs (y_zero)
y_zero= abs (y)
zero=i
PRINT “zero= “;zero
print “y_zero= “;y_zero
ENDIF
q= y_zero/y_zero_ant
print “q= “;q
IF (y*y_anterior<0 & zero<>0) | (q>1 & zero<>0)
LIST.ADD zeros, zero
PRINT “zero aproximado= “;zero
zero = 0
y_zero=10
y_zero_ant=10
ENDIF
y_anterior=y
IF y>y_max THEN y_max=y
NEXT i
PRINT “y_max= “;y_max
LIST.SIZE zeros, n
PRINT “número de zeros= “;n:PRINT
for i = 1 to n
LIST.GET zeros,i,k
print “zerooo= “;k
next i
GR.TEXT.SIZE 30
FOR j = 1 TO n
LIST.GET zeros,j,v
IF v<0 THEN xg=x_med-fx*ABS(v)
IF v>=0 THEN xg=x_med+fx*ABS(v)
u=int (v*1000)/1000
GR.TEXT.DRAW c10, xg,940,”zero”
GR.TEXT.DRAW c6, xg,970,STR$(u)
GR.RENDER
PRINT “zero aproximado= “;v
NEXT j
REM Cálculo de y_max e indicação no gráfico
fy=400/y_max
yg=1000-fy*ABS(y_max)
GR.TEXT.DRAW c5, 460,yg, “y_max= “+ str$ (y_max)
GR.RENDER
REM Desenho do gráfico
FOR i = -5 TO 5 STEP h
y = funcao (i)
fx=525/5
x_med=525
IF i<0 THEN xg=x_med-fx*ABS(i)
IF i>0 THEN xg=x_med+fx*ABS(i)
fy=400/y_max
yg=1000-fy*y
GR.POINT c11, xg,yg
GR.RENDER
NEXT i
PAUSE 5000
LIST.SIZE zeros,n
PRINT “n= “;n
i=1
PRINT “Solução final:”: print
ciclo:
LIST.GET zeros,i,z
REM Determinação mais precisa dos zeros da função – Método de Newton Raphson
x=z
h=0.01
DO
f=funcao (x)
f_linha= (funcao(x+h)-funcao(x))/h
xi=x
x=x-f/f_linha
IF abs (xi-x)<0.0001 THEN GOTO solucao
UNTIL done
solucao:
PRINT “zero mais preciso: “;x
PRINT “f(“;x;”)= “;f
i=i+1
IF i>n THEN GOTO fim
GOTO ciclo
fim:
gr.front 0
print “Tecle s se quiser voltar a ver o gráfico”
do
inkey$ k$
if k$= “s”
gr.front 1
gr.text.draw c9, 500,1600,”OK!”
gr.render
endif
until done
rem José V C Matias