Академический Документы
Профессиональный Документы
Культура Документы
𝑏
consideramos la aproximación de I = I(a; b ; f) =∫𝑎 𝑓(𝑥)𝑑𝑥.
La regla de Simpson.
Ejemplo: Utilizando el método de Simpson 1/3 calcular la siguiente integral:
1
𝐼 = ∫ 𝑥 5 𝑑𝑥 ; 𝑥 ∈ [0,1]
0
% Método de simpson 1/3
function [I,E]=met_simpson13(fun,a,b,N)
% fun : Función a ingresar
% a : extremo inicial
% b : extremo final
% N : número de particiones
%%------------------------------------
d4F=diff(diff(diff(diff(fun))));
%%-------------------
%% Integración
h=(b-a)/N;
t=a:h:b;
for k=1:length(t)
x=t(k);
f(k)=eval(fun);
end
I=(h/3)*(f(1)+4*sum(f(2:2:end))+2*sum(f(3:2:end-1))+f(end));
%% Error
d4f=[];
for k=2:length(t)-1
x=t(k);
d4f=['d4f eval(d4F)'];
end
E=abs(-(h^4)*((b-a)/180)*max(d4f));
En command Window:
>> [I,E]=met_simpson13('x^5',0,1,50)
I=
0.1667
E=
1.0489e-07
Del ejemplo anterior y aplicando el script tenemos: Método de Simpson 3/8 con f(x)= x^5, a= 0,
b= 1, #Cifras Signif Exac.= 4
clear;clc;
fprintf('***Metodo de Simpson 3/8***');
fprintf('\n\nIngrese Funcion\n(No es Necesario El Punto)\n\n');
fun=input('f(x)= ','s');
f=inline(fun,'x');
a=input('a= ');
b=input('b= ');
cse=input('#Cifras Signif Exac.= ');
Er=10^-cse;
N=floor(sqrt((b-a)^3)*10^(cse/2));% número de particiones
d2f=diff(diff(diff(diff(fun))));
while 1
h=(b-a)/(N-1);
xh=a:h:b;
%------------------------
% error
x=xh;
d2fx='eval(d2f)';
maxF=max(abs(d2fx));
E=abs(-1*h^5*maxF/90);% Error del metodo.
if E<=Er
for k=1:length(xh)
x=xh(k);
y(k)=eval(fun);
end
n=length(y);
si=0; sp=0; s3=0;
if mod(n-1,3)==0
for i=2:n-1
if mod(i,1)==0
si=si+y(i);
elseif mod(i,2)==0
sp=sp+y(i);
end
end
S=(3*h/8)*(y(1)+y(n)+3*si+3*sp);
break
else
disp('El método no es aplicable');
end
else
N=N+50;
end
end
fprintf('El valor de la integral aproximada es: %.4f\n\n ',S);
Del ejemplo anterior y aplicando el script tenemos: f(x)= x^5, a= 0, b= 1, #Cifras Signif Exac.= 4
clear all;
clc;
fprintf('Cálculo de la integral por el método de Simpson de 1/3
y 3/8\n\n');
fprintf('Para cualquier cantidad de segmentos par o impar\n\n');
f=input('introduce la función:','s');
a=input('límite inferior:');
b=input('límite superior:');
c=input('número de segmentos a dividir :');
h=(b-a)/c;
qqqqq=0;
if (-1)^c==-1
b=b-(3*h);
c=c-3;
e=b+h;
ff=b+2*h;
g=b+3*h;
ee=g-b;
x=b;
q=eval(f);
x=e;
qq=eval(f);
x=ff;
qqq=eval(f);
x=g;
qqqq=eval(f);
qqqqq=(ee)*((q+3*qq+3*qqq+qqqq)/8);
end
z=0;
x=a;
for i=1:c;
if (-1)^i==1
k=eval(f);
z=z+k;
end
x=h*i;
end
zz=0;
x=a;
for i=2:c;
if (-1)^i==-1
k=eval(f);
zz=zz+k;
end
x=h*i;
end
x=a;
if x==a
d=eval(f);
end
x=b;
if x==b
eee=eval(f);
end
z=z*4;
v=zz*2;
z=z+v+d+eee;
z=z/(3*c);
z=z*(b-a);
fprintf('Resultado: ');
z=z+qqqqq
Ecuaciones diferenciales:
% Método de Euler
function [t,x] =euler(f,t0,tf,x0,n)
h=(tf-t0)/n;
t=t0:h:tf;
x=zeros(n+1,1); %reserva memoria para n+1 elementos del
vector x
x(1)=x0;
for i=1:n
x(i+1)=x(i)+f(t(i),x(i))*h;
end
end
En Command Window:
tf=input('tiempo final, tf: ');
n=input('número de pasos, n: ');
f=@(t,x) cos(t);
%condiciones iniciales
t0=0;
x0=0;
[t,x]=euler(f,t0,tf,x0,n);
hold on
plot(t,x,'b')
y=sin(t);
plot(t,y,'r')
xlabel('t')
ylabel('x');
legend('aproximada','exacta')
title('dx/dt=cos(t)')
hold off
%tiempo final, tf: 5
%número de pasos, n: 50
% Método de Euler-otro
T=25;
tinic=0.0;
tfinal=5.0;
yinic=50.0;
n=100;
f=@(t,y) -2*(y-T);
h=(tfinal-tinic)/n;
t=zeros(1,n+1);
y=zeros(1,n+1);
t(1)=tinic;
y(1)=yinic;
for i=1:n
t(i+1)=t(i)+h;
y(i+1)=y(i)+h*f(t(i),y(i));
end
plot(t,y,'b')
title('Soluciones de dy/dt=-2*(y-T), y(0)=T mediante Euler')
axis([0 5 20 55])
xlabel('Tiempo');
ylabel('Temperatura')
hold on
plot(t,25,'-r')
f=input('\nIngrese la ecuación diferencial de la forma:
dy/dx=f(x,y)\n','s');
x0=input('\nIngrese el primer punto x0:\n');
x1=input('\nIngrese el segundo punto x1:\n');
y0=input('\nIngrese la condición inicial y(x0):\n');
n=input('\nIngrese el número de pasos n:\n');
h=(x1-x0)/n;
xs=x0:h:x1;
y1=y0;
fprintf('\n''it x0 x1 y1');
for i=1:n
it=i-1;
x0=xs(i);
x=x0;
x1=xs(i+1);
y=y0;
y1=y0+h*eval(f);
fprintf('\n%2.0f%10.6f%10.6f%10.6f\n',it,x0,x1,y1);
y0=y1;
end
fprintf('\n El punto aproximado y(x1) es = %10.6f\n',y1);
'it x0 x1 y1
0 2.000000 2.100000 0.706155
Método de Runge-Kutta
En esta sección vamos a estudiar la aplicación del método de Runge-Kutta a:
- Una ecuación diferencial de primer orden
- Un sistema de dos ecuaciones diferenciales de primer orden
- Una ecuación difrencial de segundo orden
- Un sistema de dos ecuaciones diferenciales de segundo orden
Ecuación diferencial de primer orden:
Sea una ecuación diferencial de primer orden, con la condición inicial de que en el
instante t0 el valor inicial de xes x0
Se elige una anchura de paso h y se calculan cuatro números k1, k2, k3, k4 . Según el
procedimiento ordinario de Runge-Kutta, a partir del valor de x en el instante t se determina el
valor de x en el instante t+h.
Ejemplo: Considérese el circuito en serie de la figura, R=2.0, C=0.8, y tf=10.
Vab+Vbc+Vca=0 ; Vca=-Vε , donde Vε es la fem de la batería.
Fuente: http://www.sc.ehu.es/sbweb/fisica_/elecmagnet/condensador/rc/rc.html
En Command Window:
V0=10;
R=input('Resistencia R: ');
C=input('Capacidad C: ');
tf=input('tiempo final, tf: ');
n=input('número de pasos, n: ');
f=@(t,x) V0/R-x/(R*C);
%condiciones iniciales
t0=0; x0=0;
[t,x]=rk_1(f,t0,tf,x0,n);
hold on
plot(t,x,'b')
y=C*V0*(1-exp(-t/(R*C)));
plot(t,y,'r')
xlabel('t')
ylabel('q');
legend('aproximada','exacta','Location','Southeast')
title('Carga del condensador')
hold off
for i=1:n
k1=h*f(t(i),x(i),y(i));
l1=h*g(t(i),x(i),y(i));
k2=h*f(t(i)+h/2,x(i)+k1/2,y(i)+l1/2);
l2=h*g(t(i)+h/2,x(i)+k1/2,y(i)+l1/2);
k3=h*f(t(i)+h/2,x(i)+k2/2,y(i)+l2/2);
l3=h*g(t(i)+h/2,x(i)+k2/2,y(i)+l2/2);
k4=h*f(t(i)+h,x(i)+k3,y(i)+l3);
l4=h*g(t(i)+h,x(i)+k3,y(i)+l3);
x(i+1)=x(i)+(k1+2*k2+2*k3+k4)/6;
y(i+1)=y(i)+(l1+2*l2+2*l3+l4)/6;
end
end
Ejemplo: Consideremos una serie radioactiva de tres elementos A-->B-->C en la que, una
sustancia radiactiva A se desintegra y se transforma en otra sustancia radiactiva B, que a su vez
se desintegra y se transforma en una sustancia C estable.
% En Command Window:
a=input('parámetro a: ');
b=input('parámetro b: ');
x0=input('valor inicial de x: ');
y0=input('valor inicial de y: ');
tf=input('tiempo final, tf: ');
n=input('número de pasos, n: ');
f=@(t,x,y) -a*x;
g=@(t,x,y) a*x-b*y;
%condiciones iniciales
t0=0;
[t,x,y]=rk_2_1(f,g,t0,tf,x0,y0,n);
hold on
plot(t,x,'b')
plot(t,y,'r')
xlabel('t')
ylabel('x,y');
legend('x(t)','y(t)')
title('dx/dt=-ax, dy/dt=ax-by')
hold off
for i=1:n
k1=h*v(i);
l1=h*f(t(i),x(i),v(i));
k2=h*(v(i)+l1/2);
l2=h*f(t(i)+h/2,x(i)+k1/2,v(i)+l1/2);
k3=h*(v(i)+l2/2);
l3=h*f(t(i)+h/2,x(i)+k2/2,v(i)+l2/2);
k4=h*(v(i)+l3);
l4=h*f(t(i)+h,x(i)+k3,v(i)+l3);
x(i+1)=x(i)+(k1+2*k2+2*k3+k4)/6;
v(i+1)=v(i)+(l1+2*l2+2*l3+l4)/6;
end
end
Pregunta 1: Interpretar la ecuación del calor en palabras. ¿Qué es T (t, z)? ¿dT / dt? ¿dT /
dz? ¿d ^ 2T / dz ^ 2? ¿Por qué igualar el lado izquierdo y el lado derecho?
La ecuación anterior puede ser resuelto "analíticamente", es decir, T (t, z) puede ser escrita
exactamente como una ecuación. Matlab es más apropiado, sin embargo, para la solución de
problemas numéricamente, es decir, aproximadamente como (una matriz) de números.
Con el fin de resolver el sistema numérico, debemos elegir primero un "espacio" adecuado
para resolver el problema de. Tendremos dos ejes, los ejes verticales representan la
profundidad, desde 0 m a 100 m por debajo de la superficie, y el eje horizontal
representaremos tiempo de un año.
Las condiciones de contorno: La ecuación del calor es un ejemplo de lo que se conoce como
una "ecuación diferencial parcial." Una ecuación diferencial es cualquier ecuación en la que
una función (de temperatura en el tiempo y el espacio en este caso) no está representada
directamente, sino a través de la derivada. Parcial indica que hay al menos dos variables
(tiempo y espacio) en las derivadas. Una EDO sólo tiene una derivada.
Con el fin de resolver una EDP numéricamente, tenemos que especificar las condiciones de
contorno. Los cuatro límites de nuestro "espacio" son la superficie (0 m), la profundidad del
fondo (100 m), un tiempo de inicio arbitraria, y un año después.
Límite superior: El límite superior es el más simple, vamos a especificar simplemente una
temperatura que varía según la estación, es decir,
Esto tendrá una temperatura promedio anual de 15, una baja anual de 5 y un máximo anual de
25 (el tiempo se mide en meses, y no estamos empezando el 1 de enero).
Límite inferior: La condición límite inferior es fácil, así ... vamos a suponer que no hay calor, no
llega a la parte inferior de la parte superior, es decir,
Esto especifica que el flujo de calor en la parte inferior es 0. Todavía no sabemos cuál será esta
temperatura inferior.
Fronteras izquierdo y derecho: Las condiciones de contorno izquierdo y derecho son un poco
más problemático, ya que requieren de la temperatura en cada profundidad, que es
exactamente lo que estamos tratando de descubrir, pero sí sabemos que la temperatura actual
y exactamente un año a partir de ahora debe ser el mismo.
maxiter = 500
for iter = 1:maxiter
Tlast = T; % Guardar el último acierto
T(:,1) = Tlast(:,end); % Inicializar la temperatura en t = 0 a la
última temperatura
for i=2:Nt+1,
depth_2D = (T(1:end-2,i-1)-2*T(2:end-1,i-1)+T(3:end,i-
1))/dz^2;
time_1D = K*depth_2D;
T(2:end-1,i) = time_1D*dt + T(2:end-1,i-1);
T(end,i) = T(end-1,i);
% Hacer cumplir las condiciones de contorno inferior
end
err(iter) = max(abs(T(:)-Tlast(:))); % Encuentra diferencia entre
dos últimas soluciones
if err(iter)<1E-4
break; % Pare si soluciones muy similares, que tienen la
convergencia
end
end
if iter==maxiter;
warning(' No se ha alcanzado la convergencia')
end
maxiter =
500
pseudocódigo
Graficar la solución.
figure(1)
plot(log(err)), title('Convergence plot')
figure(2)
imagesc([0 12],[0 100],T); title('Temperature plot (imagesc)')
colorbar
figure(3)
depth = [0:dz:Nz*dz];
contourf(time,-depth,T); title('Temperature plot (contourf)')
colorbar
As would be expected, the MSE decreases as the order of the fitted polynomial increases.
Comparación de interpolación:
Observamos que obtenemos la misma respuesta con la interpolación lineal, sino una respuesta
diferente a la interpolación cúbica. Aquí la interpolación cúbica hace mucho mejor trabajo de
montaje. Usted puede ver por qué en esta figura. La interpolación cúbica es mucho más cerca
de la verdadera función de la mayor parte del rango. Aunque tenga en cuenta que sobreestima
en algunas regiones y subestima en otras regiones.
t = [0.5 1 3 6];
f = [0.6065 0.3679 0.0498 0.0025];
figure
hold all
x = linspace(0.25, 6);
plot(t,f,'ko ')
plot(x, interp1(t,f,x),'r-')
plot(x, interp1(t,f,x,'pchip'),'b-')
plot(x,exp(-x),'k--')
xlabel('t')
ylabel('f(t)')
legend('datos en bruto (nodo)','interpolación lineal','interpolación cúbica','exp(-t)')
% exp(-t) es la función verdadera.
% Polinomio de interpolación cúbica de Hermite a trozos(PCHIP:
% Piecewise Cubic Hermite Interpolating Polynomial).