Algoritmos Numéricos Fundamentales
Enviado por Chuletator online y clasificado en Matemáticas
Escrito el en español con un tamaño de 3,46 KB
Método de Newton-Bisección
f=inline('----'); df=inline('----'); em=eps/2;a=--;b=---;fa=f(a);fb=f(b);x=(a+b)/2;[a x b],fx=f(x);[fa fx fb]
(Si está entre a-x)
b=x;fb=fx;dfx=df(x);if abs(dfx)>em*abs(fx),y=x-fx/dfx;[a y b],else,dfx,end;x=y;fx=f(x);[fa fx fb]
(Si está entre x-b)
a=x;fa=fx;dfx=df(x);if abs(dfx)>em*abs(fx),y=x-fx/dfx;[a y b],else,dfx,end;x=y;fx=f(x);[fa fx fb]
Método de la Secante-Bisección
f=inline('---') em=eps/2;a=---;b=----;fa=f(a);fb=f(b);x0=a;x1=b;fx0=fa;fx1=fb;m=(fx1-fx0)/(x1-x0);if abs(m)>em*abs(fx1),x=x1-fx1/m;[a x b],else m,end;fx=f(x);[fa fx fb]
(Si está entre x-b)
x0=x1;x1=x;fx0=fx1;fx1=fx;a=x;fa=fx;m=(fx1-fx0)/(x1-x0);if abs(m>em*abs(fx1),x=x1-fx1/m;[a x b],else m,end;fx=f(x);[fa fx fb]
(Si está entre a-x)
x0=x1;x1=x;fx0=fx1;fx1=fx;b=x;fb=fx;m=(fx1-fx0)/(x1-x0);if abs(m>em*abs(fx1),x=x1-fx1/m;[a x b],else m,end;fx=f(x);[fa fx fb]
Deflación de Maehly e itraiz
p=[--------------]; dp=polyder(p); v=[]; polyval(p,---); polyval(p,---);
% Si encuentras una raíz dando valores
x=--- x=itraiz(p,dp,v,x)
Iteramos
No converge, posible raíz múltiple
Calculamos la raíz del polinomio derivado
d2p=polyder(dp) u=[]; x=itraiz(dp,d2p,u,x)
%% No converge de manera muy clara
Calculamos la raíz de p''(x)
d3p=polyder(d2p); x=itraiz(d2p,d3p,u,x)
Comprobamos que es raíz con
polyval(p,x) polyval(dp,x) polyval(d2p,x) v=[v;x;conj(x);x;conj(x);x;conj(x)] x=i x=itraiz(p,dp,v,x) v=[v;x;conj(x)] polyval(p,x)
Interpolación de Lagrange
x=[----]'; y=[----]'; n=length(x); v=ones(n,1) M=[v] for k=1:n-1;v=v.*x;M=[M v];end coef=M\y
D es la solución
D=coef(end:-1:1)
Polinomios de Chebyshev en [a,b]
Cálculo de nodos de Chebyshev
n = número de partes en que se divide el intervalo
n=--,a=---,b=--- for k=1:n+1;x(k)=(a+b)/2+((b-a)/2)*cos(2*(n-(k-1))+1)*pi/(2*n+2));end
Interpolación de Hermite
M=[1 a a^2 a^3 ; 1 b b^2 b^3; 0 1 2*a 3*a^2; 0 1 2*b 3*b^2] b=[----- ------ ------ ------]' coef=M\b
Fenómeno de Runge
Ajuste de la función de Runge con polinomio de grado <= 20
En los nodos obtenidos con xj = ..., j = 0, 1, ..., 100. h = 1/20
x=(-5:0.1:5)'; b=inline('1./(1+x.^2)'); b=f(x); v=ones(length(x),1); A=[v] for k=1:20;v=v.*x;A=[A v];end coef=(A'*A)\(A'*b); % de menor a mayor k=20 [Q R]=qr(A); a=R(1:k+1,:)\(Q(:,1:k+1)'*b); p=polyfit(x,b,20) % de mayor a menor
Integración Numérica Adaptativa
f=inline('---');a=--;b=--;ea=---;er=---; x=[a (a+b)/2 b]; [i1 e1]=iehardy(x(1),x(2),f);[i2 e2]=iehardy(x(2),x(3),f);I=[i1 i2];E=[e1 e2];itg=sum(I);error=sum(E);[error ea+er*abs(itg)] [s,k]=max(E)
% Repetir dos líneas, hasta que el error sea menor que ea + er * abs(itg)
% Si tarda mucho
[s,k]=max(E) ind=1;while ind==1,k1=k+1;xn=(x(k)+x(k1))/2;x=[x(1:k) xn x(k1:end)]; [i1 e2]=iehardy(x(k),xn,f);[i2 e2]=iehardy(xn,x(k1+1),f); I=[I(1:k-1) i1 i2 I(k1:end)];E=[E(1:k-1) e1 e2 E(k1:end)];itg=sum(I);error=sum(E); if error<ea+er*abs(itg),[itg error],ind=0;else,[s,k]=max(E);end,end
% Para saber el número de iteraciones, usar length(x)