Title | Programas 2016 - función que resuelve la ecuación de segundo grado |
---|---|
Author | Isabel Millan Diaz |
Course | Matemáticas I |
Institution | Universidad de Huelva |
Pages | 6 |
File Size | 115.2 KB |
File Type | |
Total Downloads | 20 |
Total Views | 128 |
función que resuelve la ecuación de segundo grado...
Función que resuelve la ecuación de segundo grado ax^2+bx+c=0: function [x1 x2]=cuadratica(a,b,c) %resuelve la ecuación de segundo grado 'ax^2+bx+c=0' Delta=b^2-4*a*c; if Delta>0 x1=(-b+sqrt(Delta))/(2*a); x2=(-b-sqrt(Delta))/(2*a); disp('tiene dos raíces reales') elseif Delta==0 x1=-b/(2*a);x2=x1; disp('tiene una raiz real doble') else x1=(-b+sqrt(Delta))/(2*a); x2=(-b-sqrt(Delta))/(2*a); disp('tiene dos raíces complejas conjugadas') end end
Función que permite calcular el factorial de un número natural: function y=factor(n) % Esta función determina el factorial de un número natural n if nM b=x; else a=x; end k=k+1; end end end
Función que usa el método de bisección para calcular una aproximación a una raíz de la ecuación f(x)=0: function [xvect,xdif,fx,nit]=biseccion(a,b,tol,nmax,fun) %Esta función aplica el método de bisección %[a,b] es un intervalo que contiene a la raíz que buscamos %fun es la función (p. e. definida como una cadena de caracteres) %xvect es el vector formado por las aproximaciones sucesivas %xdif es el vector formado por las distancias entre aproximaciones %fx es el residuo %tol es la cota de error %nmax es máximo de iteraciones que admitimos err=tol+1;nit=0;xvect=[];fx=[];xdif=[]; while nittol nit=nit+1; c=(a+b)/2;x=c;fc=eval(fun);xvect=[xvect;x]; fx=[fx;fc];x=a; if fc*eval(fun)>0 a=c; else b=c; end err=0.5*abs(b-a);xdif=[xdif;err]; end end
Todas las funciones que siguen aplican el método de Newton-Raphson para el cálculo de una solución de la ecuación f(x)=0: function [r,dif]=newraph(h,x0,n) %calcula las n primeras aproximaciones a la raíz r de h(x)=0 próxima a xo usando Newton-Raphson %calcula las diferencias entre aproximaciones consecutivas %h puede darse como cadena de caracteres %probar con f(x)=xe^x-1, x0=0, x0=1 u otro valor syms x dh=diff(h); r=x0;dif=[]; for i=1:n if subs(dh,x0)==0 fprintf('la derivada se anula'); return else x1=x0-subs(h,x0)/subs(dh,x0); r=[r;x1];dif=[dif;abs(x1-x0)];x0=x1; end end end
function [xvect,xdif,fx,nit]=newton(x,tol,nmax,fun,dfun) %fun y dfun pueden ser introducidas como cadenas de caracteres %no acepta las funciones inline %por ejemplo newton(1,10^(-12),10,'x^2-5','2*x') err=tol+1;nit=0;xvect=x;fx=eval(fun);xdif=[]; while nittol nit=nit+1; x=xvect(nit); dfx=eval(dfun); if dfx==0 err=tol*1.e-10; fprintf('la derivada se anula'); else xn=x-fx(nit)/dfx;err=abs(xn-x);xdif=[xdif;err]; x=xn;xvect=[xvect;x];fx=[fx;eval(fun)]; end end end
function [xn,it]=newtonraph(x0,f,df,n,tol) % f y df pueden venir dadas como archivos de función o inline %[xn,it]=newtonraph(1,'f','df',20,10^(-10)) %[xn,it]=newtonraph(1,inline('-exp(-x)+x'),inline('exp(-x) +1'),20,10^(-10)) %0^(-10)) it=0;xn=x0; fn=feval(f,xn); while (abs(fn)>tol && it...