integrales simbólicas y numéricas de matlab
En MATLAB, int se usa principalmente para la integración simbólica y trapz, dblquad, quad, quad8, etc. se usan para la integración numérica.
int(s) La integral indefinida de la expresión simbólica s
int(s,x) La integral indefinida de la expresión simbólica s con respecto a la variable x
int( s,a,b) La integral definida de la expresión simbólica s, a,b son los límites superior e inferior de la integral respectivamente
int(s,x,a,b) La integral definida de la expresión simbólica s con respecto a la variable x Integración, a y b son los límites superior e inferior de la integral respectivamente
método de integración trapezoidal trapz(x,y), cuando x representa la vector discretizado del intervalo de integración, y es un vector de la misma dimensión que x, lo que significa Integrade, z devuelve el valor integral.
quad8('fun',a,b,tol) Integración numérica con tamaño de paso variable, fun representa el nombre de la función M del integrando, a, b son los límites superior e inferior de la integración respectivamente, tol es la precisión, falta La provincia es 1e-3.
fblquad('fun',a,b,c,d) Integración numérica doble en un área rectangular, fun representa el nombre de la función M del integrando, a y b son respectivamente. Los límites superior e inferior de x, c, d son los límites superior e inferior de y respectivamente.
Ejemplo 1 Calcular integral doble
Primero escribe cuatro Archivos de funciones M,
% Archivo de algoritmo integral doble dblquad2.m
función S=dblquad2(f_name,a,b,c_lo,d_hi,m,n)
%donde f_name es la cadena de función del producto, 'c_lo' y 'd_hi' son las funciones de límite inferior y superior de y, ambas son funciones escalares de x, b son el límite inferior y el límite superior de x respectivamente; m, n son fracciones iguales en las direcciones x e y respectivamente (el valor predeterminado es 100).
if nargin<7, n=100 end
if nargin<6; , m=100; end
if m<2|n<2
error('Número de intervalos no válido');
end
mpt=m+1; hx=(b-a) /m; x=a+(0:m)*hx;
para i=1:mpt
ylo= feval_r(c_lo,x(i)); yhi=feval_r( d_hi,x(i));
hy=(yhi-ylo)/n;
para k=1 :n+1 y(i,k)=ylo+(k -1)*hy; f(i,k)=feval_r(f_name,x(i),y(i,k)); p> G(i)=trapz(y(i,: ),f(i,:));
fin
S=trapz(x,G); p>
%integrand eg3_fun.m p>
función z=eg3_fun(x,y)
z=1+x+y;
% integral función de límite inferior eg3_low.m
función y=eg3_low(x)
y=-sqrt(1-x^2);
% límite superior integral function eg3_up.m
function y= eg3_up(x)
y=sqrt(1-x^2);
Después de guardar, use el código MATLAB en la ventana de comando:
>>clear
>>dblquad2('eg3_fun',-1,1,'eg3_low','eg3_up')
El resultado es
ans =3.1383
Para obtener una solución numérica más precisa, el intervalo debe ser más refinado. Por ejemplo, las direcciones x e y se dividen en partes iguales. 1000 puntos código MATLAB:
>>clear; dblquad2('eg3_fun', -1,1,'eg3_low','eg3_up',1000,1000)
El resultado es. respuesta = 3,1415.
Este problema también se puede resolver usando símbolos int. El código de MATLAB es:
>clear;syms x y;
>iy=int(1+x). +y,y,-sqrt(1-x^2),sqrt(1-x^2));
>>int(iy,x,-1,1)
El resultado es
ans =pi
Ejemplo 2 cálculo quad8 de integral definida
Función %M fun1.m
función y= fun1(x)
y=x.^4;
Después de guardar, use el código MATLAB en la ventana de comandos:
>>clear;
>>quad8('fun1',-2,2)
>>vpa(quad8('fun1',-2,2),10) %Mostrar el resultado con 10 cifras significativas
El resultado es
ans =12.8000
ans =12.80000000
Para integración numérica con tamaño de paso variable, quad y quad8 se usan comúnmente Comando, quad usa el método Simpson de tamaño de paso adaptativo, quad8 usa el método Newton-Cotes de octavo orden de tamaño de paso adaptativo, recomendamos usar quad8, que no solo tiene mayor precisión, sino que también tiene cierta adaptabilidad a la convergencia falsa y el singular falso integrales, y quad es peor.
Método integral de Roberg código de programa MATLAB
función [I, paso]=Roberg(f,a,b,eps)
if(nargin==3)
eps=1.0e-4;
fin;
M=1;
tol =10;
k=0;
T=zeros(1,1);
h=b-a;
T ( 1,1)=(h/2)*(subs(sym(f),findsym(sym(f)),a)+subs(sym(f),findsym(sym(f)),b));
mientras tol>eps
k=k+1;
h=h/2;
Q=0; p >
para i=1:M
x=a+h*(2*i-1);
Q=Q+subs(sym(f), findsym (sym(f)),x);
end
T(k+1,1)=T(k,1)/2+h*Q; p >
M=2*M;
para j=1:k
T(k+1,j+1)=T(k+1,j) + (T(k+1,j)-T(k,j))/(4^j-1);
end
tol=abs(T(k+ 1 ,j+1)-T(k,j));
fin
I=T(k+1,k+1);
step =k;
Código de programa MATLAB para el método de integración adaptativa
función I=SmartSimpson(f,a,b,eps)
if(nargin== 3)
eps=1.0e-4;
fin;
e=5*eps;
I=SubSmartSimpson(f ,a,b,e);
función q=SubSmartSimpson(f,a,b,eps)
QA=IntSimpson(f,a,b,1,eps);
QLeft=IntSimpson(f,a,(a+b)/2,1,eps);
QRight=IntSimpson(f,(a+
b)/2,b,1,eps);
if(abs(QLeft+QRight-QA)<=eps)
q=QA;
else
q=SubSmartSimpson(f,a,(a+b)/2,eps)+SubSmartSimpson(f,(a+b)/2,b,eps);
end
Código MATLAB del método integral Wilson θ para análisis de respuesta de vibración lineal
% ver también
% contáctame matlabsky@gmail.com
% 2010-02-26 16:52:12
%
clc
clear
% Parámetros de la ecuación de movimiento estructural
M=1500000;
K=3700000;
C=470000;
% parámetro de Wilson θ
theta=1.4;
dt=0.02; % intervalo de tiempo
tau=dt*theta;
% procesamiento de datos
eqd =load('acc_ElCentro_0.34g_0.02s.txt'); % Estímulo de aceleración, la primera columna es tiempo, la segunda columna es aceleración
n=size(eqd,1);
t=0:dt:(n-1)*dt;
xg=eqd(:,2)*9.8; % Aceleración del proceso
dxg=diff( xg) *theta; %
F=-M*xg;
% D2x velocidad; x desplazamiento
D2x=ceros(n,1);
Dx=ceros(n,1);
x=ceros(n,1);
para i=1:n-1
K_ba=K+3/tau*C+6/tau^2*M;
dF_ba=-M*dxg(i)+(M*6/tau+3* C) *Dx(i)+(3*M+tau/2*C)*D2x(i);
dx=dF_ba/K_ba;
dD2x=(dx* 6/ tau^2-Dx(i)*6/tau-3*D2x(i))/theta;
D2x(i+1)=D2x(i)+dD2x;
Dx(i+1)=Dx(i)+D2x(i)*dt+dD2x/2*dt;
x(i+1)=x(i)+Dx(i )* dt+D2x(i)*dt^2/2+dD2x/6*dt^2;
fin
subtrama(311)
trama (t ,x) % desplazamiento
subtrama(312)
trama(t,Dx) % velocidad
subtrama(313)
trama (t,D2x)% de aceleración
El código del programa matlab del algoritmo de Runge-Kutta de cuarto orden para resolver ecuaciones diferenciales ordinarias
función [x,y] = MyRunge_Kutta(fun ,x0, xt,y0,PointNum,varargin)
El método %Runge-Kutta resuelve la ecuación diferencial en la forma y'(t) = f(x,y(x))
%Este programa puede resolver ecuaciones diferenciales de alto orden.
Simplemente escriba su forma como la forma vectorial de la ecuación diferencial anterior
% El rango de x es [x0, xt], el valor inicial es y0, PointNum es el número de puntos discretos y varargin es un elemento de entrada opcional Puede pasar los parámetros apropiados a la función f(x,y)
si nargin < 4 | PointNum <= 0
PointNum= 100;
si nargin < 3
y0 = 0;
fin
y(1,:) = y0(:) '; %El valor inicial se almacena en forma de vector de fila
h = (xt-x0)/(%PointNum-1); PointNum]'*h; %Obtener x valor del vector
para k = 1:PointNum % cálculo iterativo
f1 = h*feval_r(fun,x(k),y(k ,:),varargin {:}); p>
f1 = f1(:)'; %get k1 en la fórmula
f2 = h*feval_r(fun,x(k) + h/2,y(k,:) + f1 /2,varargin{:});
f2 = f2(:)'; %get k2 en la fórmula
f3 = h*feval_r(fun,x(k) + h /2,y(k,:) + f2/2,varargin{:});
f3 = f3(:)'; obtenga k3 en la fórmula
f4 = h *feval_r(fun,x(k) + h,y(k,:) + f3,varargin{:});
f4 = f4(:)'; %Obtener k4 en la fórmula
y(k + 1,:) = y(k,:) + (f1 + 2*(f2 + f3) + f4)/ 6;%