miércoles, 18 de enero de 2012

Newton Raphson como función en Matlab


function x=newtonraphson(fun,dfun,x0,tol,maxit)


k=0;
corr=tol+1;


while abs(corr)>tol & k<maxit
    
    k=k+1;
    fx0=feval(fun,x0);
    dfx0=feval(dfun,x0);
    if dfx0==0
        error('la derivada se anula')
    end
    corr=fx0/dfx0;
    x=x0-corr;
    x0=x;
end

Newton Raphson en Matlab


%newton raphson
limpiar
fun=input('Ingresa la f(x) entre comillas: ');
f=inline(fun);
df=input('Ingresa la derivada de la función entre comillas: ');
df=inline(df);
x=input('Ingresa el x0: ');
tol=input('Ingresa la tolerancia: ')
i=1;
x(i)=x;
corr=tol+1;
k=0;
maxit=10;


while k<maxit & abs(corr)>tol
    fx=feval(f,x(i));
    dfx=feval(df,x(i));
    corr=fx/dfx;
    x(i+1)=x(i)-corr;
    i=i+1;
end


fprintf('iter   resultado \n')
for j=1:i
fprintf('%d  \t %10.5f \n',(j-1),x(j))
end


if abs(b-a)>tol
    error('Se alcanzó el número máximo de iteraciones')
end

Simpson 1/3 en Matlab


%regla de simpson 1/3
clear all; close all; clc
fun=input('Ingresa la función f(x) entre comillas: ');
f=inline(fun);
n=1;
while mod(n,2)~=0
    n=input('Ingrese el número de subintervalos: ');
    if mod(n,2)~=0
        disp('El número de subintervalos debe ser par, pulse una tecla para continuar')
        pause
    end
end
a=input('Ingrese el límite inferior de la integral: ');
b=input('Ingrese el límite superior de la integral: ');


h=(b-a)/n;


sumai=0;
sumap=0;


for i=1:2:n-1
    sumai=sumai+feval(f,h*i+a);
end
for i=2:2:n-2
    sumap=sumap+feval(f,h*i+a);
end


int=(h/3)*(feval(f,a)+4*sumai+2*sumap+feval(f,b));


disp(['El resultado de la integral es ' num2str(int)])

Runge Kutta 44 en Matlab


clear all;close all;clc
fun=input('Ingresa la función f(t,y) entre comillas: ');
f=inline(fun,'t','y');
y(1)=input('Ingrese la condición inicial y(0): ');
t0=input('Ingrese t0: ');
max=input('Ingrese el t final: ');
h=input('Ingrese el paso: ');
t=t0:h:max;
n=length(t);


for i=1:n-1
    
    k1=feval(f,t(i),y(i));
    k2=feval(f,t(i)+h/2,y(i)+h*k1/2);
    k3=feval(f,t(i)+h/2,y(i)+h*k2/2);
    k4=feval(f,t(i)+h,y(i)+h*k3);
    
    y(i+1)=y(i)+h/6*(k1+2*k2+2*k3+k4);
    
end


plot(t,y)

Euler explícito en Matlab


clear all;close all;clc
fun=input('Ingresa la función f(t,y) entre comillas: ');
f=inline(fun,'t','y');
y(1)=input('Ingrese la condición inicial y(0): ');
t0=input('Ingrese t0: ');
max=input('Ingrese el t máximo: ');
h=input('Ingrese el paso: ');
t=t0:h:max;
n=length(t);


for i=1:n-1
    y(i+1)=y(i)+h*feval(f,t(i),y(i));
end


plot(t,y)

martes, 17 de enero de 2012

Newton Raphson Multivariable



Si quieren que el usuario ingrese las funciones, jacobiana, tolerancia, etc. deben ocupar el comando input.


%newton raphson multivariable

clear all; close all; clc;

%funciones  x^2+x*y+y^2-1=0
%           x^2-y=0
f=inline('[x(1)^2+x(1)*x(2)+x(2)^2-1; x(2)-x(1)^2]');
df=inline('[2*x(1)+x(2) x(1)+2*x(2); -2*x(1) 1]');

%punto de partida para x e y
x0=[1;1];

%iteraciones máximas
maxi=10;

%tolerancia
tol=1.e-12;

corr=tol+1;
k=0;

while k<=maxi & norm(corr,inf)>tol
    
    fx0=feval(f,x0);
    dfx0=feval(df,x0);
    corr=dfx0\fx0;
    x=x0-corr;
    x0=x;
    k=k+1;
end

disp('la solución es')
disp(x)

if norm(corr,inf)>tol
    error('Se alcanzó el número máximo de iteraciones')
end

disp(['se calculo en ' num2str(k) ' iteraciones'])

Bisección en Matlab


%bisección
clear all; close all; clc;
fun=input('Ingrese la función f(x) entre comillas: ');
f=inline(fun);
a=input('Ingrese el límite inferior del intervalo: ');
b=input('Ingrese el límite superior del intervalo: ');
tol=input('Ingrese la tolerancia: ');
maxit=input('Ingrese el máximo de iteraciones: ');


fa=feval(f,a);
fb=feval(f,b);
k=0;


if fa*fb>0
    error('la función tiene el mismo signo en ambos extremos')
end


while abs(b-a)>tol & k<maxit
    if fa*fb==0
        
        if fa==0
            s=a;
            break
        else
            s=b;
            break
        end
        
    else
        
        k=k+1;
        s=(a+b)/2;
        fs=feval(f,s);
        if fa*fs<0
            b=s;
            fb=feval(f,b);
        else
            a=s;
            fb=feval(f,a);
        end
    end
end


disp('la solución es')
disp(s)


if abs(b-a)>tol
    error('Se alcanzó el número máximo de iteraciones')
end


disp(['se calculo en ' num2str(k) ' iteraciones'])