Scilab – determinação de raizes

UPDATE: em breve eu vou disponibilizar todo o código fonte que fiz e que copiei durante todo meu curso para domínio público, (caso obtenha aprovação dos autores originais tambem !)

Trabalhos da feito por demanda do curso de Ciência da Computação – UEL (mais específicamente pela profa M4ria Ang3lica ano de 2008

Minha motivação para postar: Deu certo bem rápido, no máximo estou economizando 2horas de quem desenvolve, e principalmente Creio que ninguem deve ser obrigado a implementar algo que já atingiu a perfeição ! procure no relp por “root”

-Sim.. existe um método que determina todas as raizes de uma função em Scilab !

Método de Quebra – Bissecção

Este método foi muito bom de implementar pois ele funciona ! ¬¬


//Fabiano Soriani

//MÉTODO DE QUEBRA
// f : Uma String de função, ex. y = x*100
// a : Limite inferior de busca
// b : Limite superior de busca
function [xm]=bisseccao(f,a,b)
deff(‘[y]=func(x)’,f)

plota(f,a,b)

if(a>b)
xm = %false
disp(‘A entrada forenecida foi ilegal, a > b’)
halt
return
end

it = 100
i=0
for i=0:it
xm = (a+b)/2
erro = func(xm)
//printf(‘a:%f b:%f\n’,a,b)
disp(erro)
if (abs(erro)<0.000001)
break
end

if(xm<0) //Esse if se mostra nescessario para evitar erros em por exemplo y=x^2 -4 [-1,4] e [-4,1]
if func(xm) < 0
b = xm
else
a = xm
end
else
if func(xm) > 0
b = xm
else
a = xm
end
end
end
plota_ponto(xm,0)
if i == it
disp(‘>>>>Numero máximo de iterações atingido ! Não há garantia de precisão’)
end
disp(‘Numero de Iterações:’)
disp(i)
printf(‘Resultado: x=%f \n’,xm)//xm
endfunction

Método da Secante

Método ingrato.. porcaria (grande coisa que converge um pouco mais rápido, se não convergir vc tem que rodar outro !!

//Fabiano Soriani

//MÉTODO DA SECANTE
// f : Uma String de função, ex. y = x*100
// a : Limite inferior de busca
// b : Limite superior de busca
function [raiz]=secante(f,a,b)
deff(‘[y]=func(x)’,f)

it = 100
plota(f,a,b)
x=ones(it)’
x(1)=a
x(2)=b
//zero=%f
i=0
for i=2:it
deno= ( func( x(i) ) -func( x(i-1) ) )
if deno == 0
deno = 0.0000001
//zero = %t
break
end
x(i+1) = x(i) -( func(x(i))*(x(i)-x(i-1))) / deno
raiz = x(i+1)
//disp(raiz)
end
i=i-3

plota_ponto(raiz,0)
//if zero
//disp(‘>>>>Houve uma divisão por zero ! Não há garantia de precisão’)
//end
if i == it-3
disp(‘>>>>Numero máximo de iterações atingido ! Não há garantia de precisão’)
end
disp(‘Numero de Iterações:’)
disp(i)
printf(‘Resultado: x=%f \n’,raiz)//xm
endfunction

Método de Newton

<Ainda em desenvolvimento extremamente errado no momento =P>

Utils para plotar

Não é nada essencial mas ajuda..

//PLOTA o grafico 2d
//PARAMs:
//Uma funcao,
//Um intervalo [a,b]
function plota(f,a,b)
if (a>b)
s=a;a=b;b=s; //SWAP básico
end

deff(‘[y]=func(x)’,f)
x(1) = a
x(2) = b
y(1) = func(a)
y(2) = func(b)

xx = linspace(a-2, b+2, 400)’

for i=1:400
yye(i) = func(xx(i))
end
xbasc()
plot2d(xx, [yye], style=[2], leg=”Espera-se que haja uma raiz no intervalo plotado.”)
plot2d(x, y, -9,axesflag=5)
xtitle(“Plotagem de inspeção”)
endfunction

function plota_ponto(x,y)
plot2d(x, y, -4 )
endfunction

Como usar

Definido como um .sce

//Fabiano Pereira Soriani
getf('meu_util.sci')
getf('quebra.sci')
getf('secante.sci')
getf('newton.sci')

//Método de quebra
f = ‘y=x^3 – 3*x*x – x + 9’
f = ‘y= x*x -4’
f = ‘y= x -cos(x)’
f = ‘y= x*x-2′
//resp = bisseccao(f,-2.3,2)

//f=’y= 2*sin(x)’
//resp = secante(f,2.7,1)
f = ‘y=1 – 2*%e*(-abs(x))’

resp = newton(f,0.4)

Advertisements