INTRODUCCIÓN A LOS MÉTODOS COMPUTACIONALES (CI171)
Actividad de Aprendizaje TA-03
Ciclo 2020-01
CODIGOS TA3 Flexión de una Viga en Voladizo
ALUMNO: BREÑA ARTETA, ANDY ANGHELLO U201621298 SECCION CS6A
function TA3_U201621298_OpeningFcn(hObject, eventdata, handles,
varargin)
axes(handles.axes2)
imshow(imread('[Link]'));
axes(handles.axes1)
imshow(imread('[Link]'));
global count
count = 0;
global dato
dato=[];
[Link] = hObject;
guidata(hObject, handles);
function Material_Callback(hObject, eventdata, handles) POPUPMENU
global E
tipos_E=get(hObject,'string');
posicion_E=get(hObject,'value');
E=cell2mat(tipos_E(posicion_E));
switch E
case 'Aleación de Aluminio'
E=71.7*10^9;
case 'Cobre al berilio'
E=127.6*10^9;
case 'Latón, Bronce'
E=110.3*10^9;
case 'Hierro fundido gris'
E=103.4*10^9;
case 'Hierro fundido dúctil'
E=168.9*10^9;
case 'Hierro fundido maleable'
E=172.4*10^9;
case 'Aleaciones de magnesio'
E=44.8*10^9;
case 'Aleaciones de niquel'
E=206.8*10^9;
case 'Acero al carbono'
E=206.8*10^9;
case 'Aleaciones de acero'
E=206.8*10^9;
case 'Acero inoxidable'
E=189.6*10^9;
case 'Aleaciones de titanio'
E=113.8*10^9;
case 'Aleaciones de zinc'
E=82.7*10^9;
end
set(handles.edit1,'string',E)
function DATOS_Callback(hObject, eventdata, handles) PUSHBUTTON
global E, global h, global a, global F, global L, global count,
global dato
%CONTADOR PARA MÁXIMA CANTIDAD DE DATOS A INGRESAR
count = count + 1;
error_img=imread('[Link]');
if count >9
msgbox('Se está excediendo el número de datos a
ingresar','Aviso','custom',error_img)
count=9;
return
end
%COORDENADAS DE APOYO
[apoyo,x,ycalc] = graf_apoyo(L);
global I
%Cálculo de Inercia
I=1/12*(h^3)*(a);
set(handles.edit11,'string',I)
%Cálculo de Deflexión
Deflexion=(-(x.^3)*F*1000)/(3*E*I);
%CÓDIGO PARA GRÁFICA DEFORMADA
axes(handles.axes4)
plot(x,ycalc,'-k',apoyo(:,1),apoyo(:,2),'-g',x,Deflexion,'--r')
title('Gráfica con deflexión')
xlabel(sprintf('Longitud de %2.3f m',L));
ylabel(sprintf('Deflexión de %2.5f m',Deflexion(end,end)));
xlim([min(apoyo(:,1))-0.05*L, 1.05*L]);
grid on
grid minor
axis equal
zoom on
hold on
%CONTADOR PARA INGRESO DE DATOS CONSECUTIVOS
for i=1:count
dato(count,:)=[E,abs(Deflexion(end,end))];
set(handles.Tabla_Data,'data',dato);
end
function [apoyo,x,ycalc] = graf_apoyo(L)
function [apoyo,x,ycalc] = graf_apoyo(L)
x=linspace(0,L);
y=linspace(0,0);
p=polyfit(x,y,1);
ycalc=polyval(p,x);
apoyo=[-0.05*L 0;
0 0.05*L;
0 0;
-0.05*L -0.05*L;
0 0;
0 -0.05*L;
-0.05*L -0.1*L];
end
function RESETEO_ALL_Callback(hObject, eventdata, handles)
PUSHBUTTON
global count,global dato
msn=questdlg('------------ ¿Desea borrar todos los datos? --------
----','Reseteo de datos','Si','No','No');
if strcmp(msn,'No')
return;
else
dato=[];
count=0;
cla(handles.axes4);
axes(handles.axes4)
xlabel('Longitud')
ylabel('Deflexión')
cla(handles.axes5);
axes(handles.axes5)
title('Datos')
set(handles.edit1,'string','');
set(handles.edit6,'string','');
set(handles.edit7,'string','');
set(handles.edit8,'string','');
set(handles.edit9,'string','');
set(handles.edit10,'string','');
set(handles.edit11,'string','');
set(handles.edit12,'string','');
set(handles.edit13,'string','');
set(handles.Tabla_Data, 'Data',
cell(size(get(handles.Tabla_Data,'Data'))));
imagen = imread('[Link]');
msgbox('Los archivos fueron eliminados
correctamente','Datos eliminados','custom',imagen);
end
function Delete_Graf_Callback(hObject, eventdata, handles)
PUSHBUTTON
cla(handles.axes5);
function Met_Dif_div_Callback(hObject, eventdata, handles)
PUSHBUTTON
Dif_divi
function pushbutton1_Callback(hObject, eventdata, handles)
PUSHBUTTON
load TA3_U201621298.mat datas_x datas_y E_prueba
n=length(datas_x)-1;
DD=zeros(n+1);
DD(:,1)=datas_y;
for k=2:length(datas_x)
for J=k:length(datas_x)
DD(J,k)=(DD(J,k-1)-DD(J-1,k-1))/(datas_x(J)-datas_x(J-
k+1));
end
end
set(handles.uitable1,'data',[datas_x DD])
syms x;
polnew=DD(1,1);
P=1;
for i=1:n
P=P*(x-datas_x(i));
polnew=polnew+P*DD(i+1,i+1);
end
polnew=expand(polnew);
disp('La función obtenida será la siguiente:')
pretty(polnew);
x=E_prueba;
def=eval(polnew);
set(handles.edit2,'string',def);
function LINEA_DE_TENDENCIA_Callback(hObject, eventdata, handles)
PUSHBUTTON
global dato, global caso, global F, global I, global L
%CALCULO DE VALOR REAL
E_prueba=str2double(get(handles.edit8,'string'));
def_real=(-(L.^3)*F*1000)/(3*E_prueba*I);
set(handles.edit6,'string',abs(def_real));
%PLOTEO DE DATOS
datas_x=dato(:,1);
datas_y=dato(:,2);
axes(handles.axes5)
plot(datas_x,datas_y,'g.','markersize',13,'markerfacecolor','g')
hold on
grado=str2double(get(handles.edit12,'string'));
ws = warning('off','all');
x1=linspace(min(datas_x),max(datas_x));
switch caso
case 'Polinomial'
coef=polyfit(datas_x,datas_y,grado);
funcion=@(x1) polyval(coef,x1);
texto="Polinomio de grado " + grado;
f=polyval(coef,datas_x);
[R] = r(datas_y,f);
%CALCULO DE VALOR APROXIMADO
def_prueba=funcion(E_prueba);
case 'Potencia'
coef=polyfit(log10(datas_x),log10(datas_y),1);
funcion=@(x1) (10^coef(2))*x1.^coef(1);
texto='Aproximación potencia';
f=polyval(coef,log10(datas_x));
datas_y=log10(datas_y);
[R] = r(datas_y,f);
%CALCULO DE VALOR APROXIMADO
def_prueba=funcion(E_prueba);
case 'Exponencial'
coef=polyfit(datas_x,log(datas_y),1);
funcion=@(x1) exp(coef(2))*exp(x1*coef(1));
texto='Aproximación Exponencial';
f=polyval(coef,datas_x);
datas_y=log(datas_y);
[R] = r(datas_y,f);
%CALCULO DE VALOR APROXIMADO
def_prueba=funcion(E_prueba);
case 'Logaritmica'
coef=polyfit(log(datas_x),datas_y,1);
funcion=@(x1) coef(1).*log(x1)+coef(2);
texto='Aproximación Logaritmica';
f=polyval(coef,log(datas_x));
[R] = r(datas_y,f);
%CALCULO DE VALOR APROXIMADO
def_prueba=funcion(E_prueba);
case 'Inversa'
coef=polyfit(datas_x,1./datas_y,1);
funcion=@(x1) 1/((coef(1).*x1)+coef(2));
texto='Aproximación Inversa';
f=polyval(coef,datas_x);
datas_y=1./datas_y;
[R] = r(datas_y,f);
%CALCULO DE VALOR APROXIMADO
def_prueba=funcion(E_prueba);
case 'Spline lineal'
coef=num2str('- - - - - - - - - -');
funcion=@(x1) interp1( datas_x , datas_y , x1 ,'linear');
%CALCULO DE VALOR APROXIMADO
def_prueba = interp1( datas_x , datas_y , E_prueba );
R='--';
texto='Spline lineal';
case 'Trazadores Cúbicos'
coef=num2str('- - - - - - - - - -');
funcion=@(x1) spline( datas_x , datas_y , x1 );
%CALCULO DE VALOR APROXIMADO
def_prueba = spline( datas_x , datas_y , E_prueba );
R='--';
texto='Spline de Trazadores Cúbicos';
end
%MUESTRA DE VALORES DE COEFICIENTES DE LA FUNCIÓN
set(handles.edit7,'string',num2str(coef))
%MUESTRA DE VALOR DE PRUEBA
set(handles.edit9,'string',def_prueba);
%CALCULO DE ERROR
e=abs((abs(def_real)-abs(def_prueba))/abs(def_real))*100; %en
porcentaje
set(handles.edit10,'string',e);
%MUESTRA DE VALOR DE R
set(handles.edit13,'string',R);
%PLOTEO DE FUNCIÓN
fplot(funcion,[x1(1),x1(end)],'--r')
grid on
grid minor
title(texto)
hold on
ylabel('\delta y (mm)')
xlabel('Modulo de Young (N/m^2)')
warning(ws)
save TA3_U201621298.mat datas_x datas_y E_prueba
%PLOTEO DE DATOS DE PRUEBA
axes(handles.axes5)
plot(E_prueba,def_prueba,'r*',E_prueba,abs(def_real),'ko')
text(E_prueba, def_prueba, 'valor probado', 'FontSize', 9);
text(E_prueba, abs(def_real), 'valor real', 'FontSize', 9);
legend('Data','Funcion','Valor probado','Valor
real','Location','NE')
hold on
function [R] = r(datas_y,f)
function [R] = r(datas_y,f)
%coeficiente R
n=length(datas_y);
yprom=sum(datas_y)/n;
Num=sum((f-yprom).^2);
Den=sum((datas_y-yprom).^2);
R=Num/Den;
end
function Grafica_I_Callback(hObject, eventdata, handles)
PUSHBUTTON
global a, global h, global L
axes(handles.axes3)
%GRÁFICA DE PERFIL DEL ELEMENTO
cubo(a,h,L)
xlabel(sprintf('Ancho de %0.3f m',a));
ylabel(sprintf('Largo de %0.3f m',L));
zlabel(sprintf('Altura de %0.3f m',h));
axis equal
grid minor
grid on
%CÁLCULO ALTERNO DE INTERCIA
I=1/12*(h^3)*(a);
set(handles.edit11,'string',I)
Function cubo(a,h,L)
function cubo(a,h,L)
coord=[a 0 0;a L 0; 0 0 0; 0 L 0; a 0 h; a L h; 0 0 h; 0 L h];
%Orden guía
%
% 7-------8
% /| /|
% / | / | h
% 5--|----6 |
% | 3----|--4
% | / | / L
% 1-------2
% a
for k = 1:length(coord)/8
X = coord(8*(k-1)+1:8*(k-1)+8,1);
Y = coord(8*(k-1)+1:8*(k-1)+8,2);
Z = coord(8*(k-1)+1:8*(k-1)+8,3);
% Los puntos de cada cara se ordenan según el sentido antihorario
caras = [1 2 4 3; 5 6 8 7; 1 3 7 5; 2 4 8 6; 1 2 6 5; 3 4 8 7];
X = [X(caras(1,:)) X(caras(2,:)) X(caras(3,:)) X(caras(4,:))
X(caras(5,:)) X(caras(6,:))];
Y = [Y(caras(1,:)) Y(caras(2,:)) Y(caras(3,:)) Y(caras(4,:))
Y(caras(5,:)) Y(caras(6,:))];
Z = [Z(caras(1,:)) Z(caras(2,:)) Z(caras(3,:)) Z(caras(4,:))
Z(caras(5,:)) Z(caras(6,:))];
alpha = 0.4; % transparencia de la cara
colour =[0,0,0]; % color de la cara
fill3(X,Y,Z,colour,'FaceAlpha',alpha); % dibujar los cubos
axis equal
end
end
SLIDERS
Slide_Altura
global h
h=get(handles.Slide_Altura,'value');
set(handles.edit2,'string',h);
Slide_Ancho
global a
a=get(handles.Slide_Ancho,'value');
set(handles.edit3,'string',a);
Slide_Longitud
global L
L=get(handles.Slide_Longitud,'value');
set(handles.edit4,'string',L);
Slide_Carga
global F
F=get(handles.Slide_Carga,'value');
set(handles.edit5,'string',F);
function Dato_Corregir_Callback(hObject, eventdata, handles)
POPUPMENU
global count
numero_dato=get(hObject,'string');
posicion_dato=get(hObject,'value');
count=str2double(cell2mat(numero_dato(posicion_dato)))-1;
function CASO_Callback(hObject, eventdata, handles)
POPUPMENU
global caso
contenido=get(hObject,'string');
xay=get(hObject,'value');
caso=cell2mat(contenido(xay));
function CERRAR_Callback(hObject, eventdata, handles) PUSHBUTTON
msn=questdlg('------------ ¿Desea salir del programa? ------------
','Salir programa','Si','No','No');
if strcmp(msn,'No')
return;
else
close(TA3_U201621298);
close(Dif_divi)
end
Se realizó un ploteo de la forma tridimensional de la barra
voladiza a evaluar
Los datos del gráfico, así como los datos a utilizar de ancho,
alto y longitud de barra, pueden ser modificados a partir de las
siguientes sliders.
El tipo de material a emplear puede ser seleccionado a partir del
popupmenu_Material, cuyo valor es mostrado en el edit text “E
asignado”
Al dar al botón RUN, se obtendrá el valor respectivo para la
deformación de la barra, a partir de las propiedades asignadas,
así como el valor de la carga señalada en el Slide_Carga, los
datos obtenidos se almacenarán en la tabla inferior.
El programa fue diseñado para ingresar un máximo de 9 datos, en
caso se exceda dicha cantidad, el programa mostrará el siguiente
aviso.
Por dicha razón, se decidió añadir un corrector de datos, el cual
funciona seleccionando el dato a corregir, y se cambia al material
respectivo, este dato se actualizará automáticamente en la tabla
al dar click al botón RUN.
Se procede a seleccionar el tipo de aproximación.
A partir de los datos de la tabla, y el tipo de aproximación
seleccionado, se presiona el botón Linea de tendencia, para
realizar la gráfica respectiva. Asimismo, se completa el edit text
con el valor de E de prueba que deseemos aproximar. Se obtendrá
como resultado los datos de la deformación real, la deformación
aproximada según el método, el error entre dichos valores, así
como el coeficiente R de la gráfica. En el caso de seleccionar el
tipo Polinomial, se deberá especificar el grado del polinomio.
Respecto a la gráfica de deflexión, se obtendrá lo siguiente; lo
cual al hacerle zoom se podrán notar las diferentes deformaciones
según el material seleccionado previamente.
Con los datos reemplazados, además se podrá obtener la gráfica
según el tipo de aproximación seleccionado. Si se hace zoom a los
datos, podremos ver el error existente entre ellos. Asimismo el
valor del error entre el valor real y el aproximado variará.
Como añadido el programa arroja los valores de los coeficientes
de la función de grado mayor hasta el término independiente. Sea
el caso de la interpolación, por ejemplo:
5.2029e-92x^8 -5.8257e-80x^7 +2.8446e-68x^6 -7.9429e-57x^5 +1.3961e-45x^4 -1.5997e-34x^3
+1.1926e-23x^2 -5.5648e-13x +0.014698
Como valor agregado, se decidió añadir el método de diferencias
divididas, el cual se puede acceder al dar clic al botón
Diferencias Divididas. Se presiona Actualizar y se tendría la
matriz para el método
%f=@(x) 0.0023-1.8217e-14*(x-7.17e+10)+1.6516e-25*(x-7.17e+10) *(x-
1.276e+11)-1.5973e-36*(x-7.17e+10)*(x-1.276e+11)*(x-
1.1030e+11)+9.457e-48*(x-7.17e+10)*(x-1.276e+11)*(x-1.1030e+11)*(x-
1.034e+11)-5.4855e-59*(x-7.17e+10)*(x-1.276e+11)*(x-1.1030e+11)*(x-
1.034e+11)*(x-1.689e+11)+1.2244e-69*(x-7.17e+10)*(x-1.276e+11)*(x-
1.1030e+11)*(x-1.034e+11)*(x-1.689e+11)*(x-1.724e+11)-5.9209e-81*(x-
7.17e+10)*(x-1.276e+11)*(x-1.1030e+11)*(x-1.034e+11)*(x-1.689e+11)*(x-
1.724e+11)*(x-4.48e+10)+5.2029e-92*(x-7.17e+10)*(x-1.276e+11)*(x-
1.1030e+11)*(x-1.034e+11)*(x-1.689e+11)*(x-1.724e+11)*(x-4.48e+10)*(x-
1.138e+11);
VISTA DE GUIDE GENERAL
VISTA DE GUIDE DIFERENCIAS DIVIDIDAS