Sei sulla pagina 1di 7

http://www.mat.ucm.es/~infante/libro/libro.

htm

MTODOS NUMRICOS
Teora, problemas y prcticas con
MATLAB
Juan-Antonio Infante Jos Mara Rey

% Prctica 2.4a: Producto de una matriz triangular superior por un


vector.
disp('Producto de una matriz triangular superior por un vector.');
n=input('Cul es el tamao de la matriz? ');
A=zeros(n);
c=zeros(n,1);
for i=1:n
s=sprintf('Dame la fila %d de A (slo los elementos a la derecha
del diagonal) ',i);
A(i,i:n)=input(s);
end
v=input('Dame el vector v (como fila) ');
v=v';
A,v
for i=1:n
c(i)=A(i,i:n)*v(i:n);
end
disp('El producto de A por v es')
disp(' ')
disp(c)

% Prctica 2.4b: Producto de dos matrices triangulares superiores.


disp('Producto de dos matrices triangulares superiores.');
n=input('Cul es el tamao de las matrices? ');
A=zeros(n);
B=A;
for i=1:n
s=sprintf('Dame la fila %d de A (slo los elementos a la derecha
del diagonal) ',i);
A(i,i:n)=input(s);
end
for i=1:n
s=sprintf('Dame la fila %d de B (slo los elementos a la derecha
del diagonal) ',i);
B(i,i:n)=input(s);
end
A,B
for i=1:n
for j=i:n
C(i,j)=A(i,i:j)*B(i:j,j);
end
end
disp('El producto de A por B es')
disp(' ')
disp(C)

function v=trsup(A,b)
% Prctica 4.2c: Resuelve el sistema Av=b donde A es una matriz
% triangular superior.
n=size(A,1);
v(n)=b(n)/A(n,n);
for i=n-1:-1:1
v(i)=(b(i)-A(i,i+1:n)*v(i+1:n)')/A(i,i);
end

function area=trapecios(a,b,m)
% Prctica 7.1: Regla de los trapecios.
global fname
fname=input('Dame la funcin f(x) entre comillas ');
if nargin < 1
a=input('Dame el extremo izquierdo del intervalo ');
b=input('Dame el extremo derecho del intervalo ');
end
if nargin < 3
m=input('Dame el nmero de subintervalos ');
end
h=(b-a)/m;
x=a:h:b;
sum=0;
for i=2:m
sum=sum+f(x(i));
end
area=(h/2)*(f(a)+f(b)+2*sum);

function y=f(u) % Con este "truco" se puede pedir la funcin por


pantalla
global fname % (como "string") y, despus, evaluarla como si
fuera una
x=u; % funcin matemtica.
y=eval(fname);

function area=simpson(a,b,m)
% Prctica 7.2: Regla de Simpson cerrada.
global fname
fname=input('Dame la funcin f(x) entre comillas ');
if nargin < 1
a=input('Dame el extremo izquierdo del intervalo ');
b=input('Dame el extremo derecho del intervalo ');
end
if nargin < 3
m=input('Dame el nmero de subintervalos ');
end
h=(b-a)/(2*m);
x=a:h:b;
sump=0;
for i=2:m
sump=sump+f(x(2*i-1));
end
sumi=0;
for i=1:m
sumi=sumi+f(x(2*i));
end
area=(h/3)*(f(a)+f(b)+2*sump+4*sumi);
function y=f(u) % Con este "truco" se puede pedir la funcin por
pantalla
global fname % (como "string") y, despus, evaluarla como si
fuera una
x=u; % funcin matemtica.
y=eval(fname);

% Prctica 10.6: Calcula, mediante el mtodo de Bairstow, un par de


% races (no necesariamente complejas) de un polinomio. Pide los
% datos por pantalla.
a=input('Vector de coeficientes del polinomio (de mayor a menor grado)
');
n=length(a);
disp('Valores iniciales: ');
u=input(' u= ');
v=input(' v= ');
iter=input('Nmero mximo de iteraciones ');
prec=input('Precision deseada ');
disp(' ')
b(n)=a(1); %
c(n)=0; % no dependen de u ni de v
c(n-1)=a(1); %
sw=1;
for it=1:iter
b(n-1)=a(2)+u*b(n);
for k=n-2:-1:1
b(k)=a(n-k+1)+u*b(k+1)+v*b(k+2);
c(k)=b(k+1)+u*c(k+1)+v*c(k+2);
end
det=c(1)*c(3)-c(2)*c(2); % determinante
deltau=(c(2)*b(2)-c(3)*b(1))/det;
deltav=(c(2)*b(1)-c(1)*b(2))/det;
u=u+deltau;
v=v+deltav;
disp(sprintf('iteracin %i, u= %d, v= %d',it,u,v))
norma=norm([deltau,deltav]);
if norma<prec
disp(' ')
disp('El valor aproximado de las dos races es:')
x1=(u+sqrt(u^2+4*v))/2
x2=(u-sqrt(u^2+4*v))/2
sw=0;
break
end
end
if sw
disp('Alcanzado el mximo de iteraciones sin obtenerse
convergencia.')
end
http://www.isa.cie.uva.es/~jesusm/Cienti/index.html
fundamentos de informatica y programacion

% Script para aplicar Newton-Raphson a mifuncion

% Lectura de datos
% Tengo que leer la cota de error 'cota', el nmero de iteraciones
mximo 'n'
% y el valor inicial 'xi'

cota = input ('Cota de error objetivo: ');


n = input ('N mximo de iteraciones: ');
xi = input ('Valor inicial de la x: ');

xanterior = xi;
x = xanterior;
eanterior = inf;
e = eanterior;

i = 1; % contador de iteraciones

% Voy a dibujar las tangentes mientras calculo


figure(1)
clf
hold on
fplot('mifuncion(x)',[-2 2],'b');
grid

% Debo realizar un procedimiento iterativo mientras el error sea mayor


que la cota
% y el nmero de iteracin sea menor que n

while (e>cota) & (i<n)


y = mifuncion (xanterior);
yd = mifuncion_derivada (xanterior);

x = xanterior - y/yd;

% Para dibujar
yant=mifuncion(xanterior);
plot ([xanterior x],[yant 0],'r')
e = abs (x - xanterior);

xanterior = x;
eanterior = e;
i=i+1;
end
hold off
% Comprobacin de por cual de las dos (tres) condiciones sali
if (e<cota)
disp ('Se encontr la solucin');
disp ('La solucin hallada es: ');
x
disp ('La cota de error es: ');
e
disp ('El nmero de iteraciones utilizado es: ');
i
disp ('Y el valor de la funcin en dicho punto es: ');
mifuncion(x)
else
disp ('Se super el nmero de iteraciones');
end
function y = mifuncion (x)

y = x*x+0.5-exp(-x);
function y = mifuncion_derivada (x)

y = 2*x+exp(-x);

% Script para calcular la solucin de un sistema de ecuaciones

% En primer lugar, utilizando las facilidades de Matlab

A = input ('Matriz de coeficientes: ');


b = input ('Vector de trminos independientes: ');

disp ('Solucin')
x = A\b

% Ahora utilizando la regla de Cramer para matriz de 3 x 3

if det(A)==0
disp ('No es posible obtener la solucin');
else
for i=1:3
for j=1:3
for k=1:3
if j==i
d(k,j)=b(k,1);
else
d(k,j)=A(k,j);
end
end
end
detd=det(d);
xc(i,1)=detd/det(A)
end
end

% Script para realizar la integral definida entre a y b por


% el mtodo de los rectngulos

% La funcin est almacenada en funcion.m

% Peticin de datos

a = input('Valor inferior del intervalo: ');


b = input('Valor superior del intervalo: ');
n = input('Nmero de subintervalos para el clculo: ');

if a>b % permutacin si a es mayor que b


t=a;
a=b;
b=t;
end
fplot('funcion(t)',[a b],'b')
ancho = (b-a)/n;
suma = 0;
for i=0:n-1
f=funcion(a+i*ancho);
suma=suma+ancho*f;
if f<0
bias=f;
else
bias=0;
end

rectangle('Position',[a+i*ancho 0+bias ancho abs(f)]);


end

fprintf(1,'El valor de la integral es %f\n',suma);


% Funcion para integrar

function y=funcion(t)

y=50*(exp(-t)+0.1*sin(10.*t))/5;

Realizar un programa que pida los coeficientes de un polinomio de grado n (que


tambin debe pedir) y evale dicho polinomio en diversos puntos. El programa debe
continuar pidiendo puntos para evaluar hasta que el usuario introduzca el valor 999.
Ejemplo (slo es un ejemplo, el programa debe funcionar para cualquier polinomio y
cualquier nmero de puntos)
Si el usuario quiere evaluar el polinomio p(x)=3x3+x-1 en los puntos 1, 0 y 2, la
interaccin programa-usuario sera:
[PROGRAMA]: Grado del polinomio?
[USUARIO]: 3
[PROGRAMA]: Coeficiente de x^3?
[USUARIO]: 3
[PROGRAMA]: Coeficiente de x^2?
[USUARIO]: 0
[PROGRAMA]: Coeficiente de x^1?
[USUARIO]: 1
[PROGRAMA]: Coeficiente de x^0?
[USUARIO]: -1
[PROGRAMA]: Punto a evaluar?
[USUARIO]: -1
[PROGRAMA]: p(-1) = -5
[PROGRAMA]: Punto a evaluar?
[USUARIO]: 0
[PROGRAMA]: p(0) = -1
[PROGRAMA]: Punto a evaluar?
[USUARIO]: 2
[PROGRAMA]: p(2) = 25
[PROGRAMA]: Punto a evaluar?
[USUARIO]: -999
[PROGRAMA]: FIN

Nota: La funcin polyval(p,x), definida en matlab, evala el polinomio p (definido como


un vector cuyos elementos son los coeficientes del polinomio) en el punto x

% Evaluacion de un polinomio en puntos dados por el usuario

n = input ('Grado del polinomio: ');

for j=n:-1:0
fprintf(1,'Coeficiente de x^%d : ',j);
coef(n-j+1)=input ('');
end

while 1
x = input ('Punto a evaluar: ');
if x == -999
break;
end
fprintf(1,'p(%f) = %f\n',x,polyval(coef,x));
end

Potrebbero piacerti anche