Determinação dos zeros de uma função

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

PRINT

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

Este site utiliza o Akismet para reduzir spam. Fica a saber como são processados os dados dos comentários.