Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Parte 1- Introduccin
Este trabajo contiene una descripcin detallada de los principales elementos del entorno integrado de SCILAB, cuyo objetivo es dar a los estudiantes de ingeniera y de otras carreras tcnicas, que no tienen conocimientos avanzados de informtica, la posibilidad de desarrollar rpidamente aplicaciones para la solucin de problemas de mecnica de estructuras, en un lenguaje de alto nivel, con una interfaz interactiva de gran calidad, y lo que es todava mejor, utilizando software libre, continuamente actualizado.
Autor: Prof. Ing. Jos Luis Volta Grau Ctedra de Estructuras 2 y Estructuras 3 Facultad de Ingeniera-U.N.A. Octubre -2010
Una aplicacin puede incluir todas estas tareas, o solamente algunas, y complementarse con otras aplicaciones para las tareas restantes. La interfaz de usuario puede ser la tarea que requiere ms trabajo y tiempo de desarrollo. Antes de la industrializacin del software, que fue posible con la Programacin Orientada a Objetos (POO en el lenguaje informtico), y de los actuales sistemas operativos con interfz grfica, era comn el uso de programas con una interfz de usuario muy simple, o sin interfaz alguna, usando la lnea de comandos para correr el programa, con una sintaxis como la siguiente: >nombre_del_ejecutable(archivo_de_datos) donde archivo_de_datos era un archivo de texto en caracteres ASCII que contena los datos ordenados y formateados exactamente como el programa poda interpretarlos. El programa procesaba los datos y grababa los resultados en un archivo de texto que se poda leer con cualquier editor de textos. Actualmente casi no hay aplicaciones que no tengan su interfz grfica de usuario o GUI (Grafical User Interface), que consiste en barras de mens, barras de herramientas, cuadros de dilogo, etc. El desarrollo de esta fase del programa se ha facilitado muchsimo con los lenguajes visuales (Visual Basic, Visual C, Delphi, Java-Swing, etc.) Las siguientes tareas no son menos complicadas que la primera: edicin y verificacin de datos van enlazadas, ya que los datos deben ordenarse de un modo congruente con lo que el programa espera leer en cada paso: formato, tipo, cantidad de datos, etc., y verificar que los datos sean consecuentes con los clculos a realizar con los mismos. Los datos pueden editarse en dos formas: interactivamente, o en un archivo de texto o planilla electrnica. Para programas que requieren pocos datos de entrada es ms simple editar interactivamente, usando un cuadro de dilogo por ejemplo, pero si son muchos datos (ms de un centenar, por ejemplo) es ms cmodo editar en un archivo. Graficar los datos y los resultados son, en ingeniera, la mejor forma de verificar los clculos, pero la programacin de esta tarea requiere el empleo de un lenguaje que permita programar grficos con facilidad, de lo contrario es una tarea harto difcil. El procesamiento de datos y la salida de resultados son las partes ms simples del desarrollo de la aplicacin, las que consisten en implementar los algoritmos de clculo, tarea para la cual el ingeniero est normalmente bien entrenado, en la materia tcnica especfica que es el objetivo de la aplicacin.
1
Estudiaremos ahora algunos comandos de la barra de mens. Advertimos de antemano que, hasta la fecha, todo en el IDE de Scilab est en Ingls o Francs, incluyendo la ayuda en lnea; no hay traduccin al Espaol, aunque hay un documento .pdf en portugus, en el sitio www.scilab.org. Comando File/Execute: carga y ejecuta un script (extensin .sce) o un archivo de funciones (extensin .sci); Comando File/Open a file: abre un archivo de texto *.sce o *.sci en el editor propio de Scilab (llamado simplemente Editor en esta versin); Comando File/Load environment: carga variables y entorno de una sesin previa, grabada con el comando File/Save environment; Comando File/Change current directory: cambia el directorio de trabajo actual; Comando Applications/Editor: abre el editor integrado; Comando ?/Scilab help: ayuda detallada de las funciones, comandos, etc.
el eco despliega una matriz de 2x3 en la ventana de comandos, con a(1,1)=17.68 y a(2,3)=-14.639822, los dems elementos = 0; Scilab aument automticamente el tamao de la matriz a para dar cabida al nuevo elemento. Observacin importante: en Scilab el primer elemento de una lista, vector o matriz, tiene subndice(s) 1 y no cero como en los lenguajes de programacin C, Pascal, Java, Basic, etc. Esto es porque Scilab es una aplicacin para matemticas (los matemticos cuentan desde 1 y no desde cero, a diferencia de los profesionales informticos); d) la matriz a definida arriba es de tipo real (float o double); si asignamos: -->a(2,2)=m // se produce un error, a solo acepta nmeros; e) Scilab distingue maysculas de minsculas, por lo que A(1,1) no es lo mismo que a(1,1), es otra variable; esto lo acerca a C y lo distancia de Pascal, que no distingue maysculas de minsculas;
4
f)
g) Para comprobar que todos los elementos de b son iguales a los de a escribimos: -->chk=(b==a) chk = TTT TTT devuelve una matriz booleana, con todos sus elementos = T (true); Scilab define 2 constantes boolean: %t para valores verdaderos y %f para valores falsos; -->%t T -->%f F Si cambiamos el valor de un elemento de la matriz b: -->b(2,2)=8.72, -->chk=(b==a) devolver F para el elemento 2,2 de la matriz chk: chk = TTT TFT 4.2 Definicin explcita de matrices: --> unavar=[ ] crea una matriz vaca, sin tipo, y lo asigna a la variable unavar
--> num=[3.4,-3.4;0.114,3.44] crea una matriz 2x2 de nmeros reales, las filas se separan con punto y coma (;), y los elementos de cada fila se separan con coma (,); --> items=[item-1,item-2,item-3] crea un vector fila de 1 fila x 3 columnas, de elementos alfanumricos o de caracteres, los cuales deben ir entre comillas simples o dobles; --> filas=[item-1;item-2;item-3] alfanumrica; crea un vector columna 3 filas x 1 columna,
--> chk=[%f,%t,%f,%t] crea un vector fila de tipo bolean (%t=true, %f=false son constantes predefinidas de Scilab. 4.3 Matrices definidas por funciones Scilab posee una extensa y variada cantidad de funciones para diversos tpicos: funciones matemticas, para manejo de archivos, para interfaz de usuario, funciones utilitarias, para optimizacin y simulacin, modelado de sistemas, para grficos, etc. En nuestro trabajo utilizaremos slo una pequea cantidad de estas funciones. Funciones que definen matrices numricas: a) -->a=rand(3,3) genera una matriz de nmeros aleatorios de 3x3
5
b) -->m=zeros(3,3) crea una matriz m (3x3) de ceros (matriz cero); c) -->m=ones(3,3) crea una matriz m (3x3) unitaria; e) -->m=eye(3,3) eye (ojo)); crea una matriz m identidad [ I ] (3x3) (se lee como la palabra inglesa
e) --> m=emptystr(3,3) crea una matriz 3x3 de elementos alfanumricos vacos; no se debe confundir con la matriz vaca que explicamos antes. 4.3 Operaciones con matrices numricas a) -->d=b-a devolver la diferencia de las matrices (deben ser del mismo tamao, de filas y columnas); b) -->3.5 * num; todos los elementos de num se multiplican por 3.5; c) --> x=num*a; producto; num es de 2x2, a de 2x3 la operacin devuelve en x de 2x3 el
d) --> x=a*num produce un error, la multiplicacin no es conmutativa en general, el nmero de columnas del 1er factor debe ser igual al nmero de filas del 2; e) si a, b y num son las matrices definidas arriba, se comprueba la propiedad distributiva del producto: --> c=num*(a+b) --> d=num*a+num*b
el orden de las operaciones puede introducir errores de redondeo para los ltimos dgitos, por lo que la operacin: --> chk=(num*a+num*b==num*(a+b)) puede devolver una matriz con algunos elementos %f (false), por lo que este modo de comprobacin no es aconsejable para esta operacin; f) -->e=b devuelve la transpuesta de b usando el operador comilla simple (); g) -->f=b * a devuelve el producto vectorial de b' * a; h) -->f=b *a*b devuelve el doble producto de b' * a * b; i) -->g=inv(a) devuelve en g la matriz inversa de a; j) copiar filas o columnas de una matriz: -->props(2,5)=-3.4; // asignamos -3.4 al elemento (2,5) de la matriz props; -->props(2,3)=5.99; -->unafila=props(2,:) copiamos en 'unafila' todos los elementos de la 2 fila de 'props', unafila = 0. 0. 5.99 0. - 3.4
El signo dos puntos (:) indica 'todos los elementos' de filas o columnas;
6
-->unacol=props(:,3) copia en 'unacol' la 3 columna de 'props'; unacol = 0. 5.99 k) tamaos del vector o matriz: usamos la funcin size: -->props=zeros(4,8); creamos una matriz de ceros, de 4 filas, 8 columnas; -->[fila,col]=size(props) devuelve los tamaos de filas y columnas; -->filas=size(props,1); devuelve el tamao de filas; En esta funcin se v que Scilab admite sobrecarga de funciones, o sea que una funcin puede tener ms de una sintaxis, con parmetros diferentes.
-->MC=[12.5,33;105,008]; -->ml=list(Tipo 1,35,Tipo 2,27,Contado,%t,Tabla,MC); -->disp(ml(3)); // devuelve el elemento 3 de la lista indexada estructura: una estructura es un tipo record (en Pascal) o 'struct' (en C), con pares de datos campo-valor, donde campo es una cadena de caracteres y valor cualquier tipo de objetos de Scilab, por ejemplo: -->ms=struct(Tipo 1,36,Tipo 2,27,Contado,%t,Tabla,MC); -->disp(ms.Contado); // Contado es el campo y devuelve el valor T -->disp(ms.Tabla); // Tabla es el campo y devuelve la matriz MC
b) -->home devuelve el directorio de la cuenta del usuario actual. En Windows XP ser: C:\Documents and Settings\<cuenta del usuario>; c) -->SCIHOME devuelve el directorio donde se instal Scilab; d) -->pwd devuelve el directorio de trabajo actual, que puede cambiarse con la funcin chdir() o con el comando File/Change current directory del men File; e) -->who despliega en pantalla todos los nombres de las variables declaradas en la sesin de trabajo actual; f) -->resp=chdir(<nuevo directorio>), cambia el directorio de trabajo actual, devuelve 'T' si el cambio tuvo xito, 'F' en caso contrario; tambin puede usarse el comando de men File/Change current directory; g) -->clc borra el contenido de la ventana de comandos (limpia la ventana); h) -->get_absolute_file_path(<nombre_archivo>), devuelve la ruta completa (incluyendo el ltimo separador \ de nombres) del archivo nombre_archivo, que contiene un script que se ejecuta en Scilab,; el archivo debe estar abierto en Scilab; h) -->archivo=uigetfile(mscara, directorio inicial, ttulo del dilogo): cuadro de dilogo para seleccionar un archivo para abrir; todos los parmetros son opcionales, por lo que normalmente escribiremos simplemente archivo=uigetfile(). Pero por ejemplo, si queremos abrir el archivo miarch.dat en el directorio c:\documents and settings\estructuras-3\mis documentos\jose luis, escribimos: -->midir='c:\CursoScilab; -->arch=uigetfile(*.dat,midir,Abrir archivo de datos); La funcin devuelve el nombre completo (el path o ruta) del archivo (en este ejemplo 'c:\CursoScilab\misdatos.dat'), si se pulsa el botn 'Open' del cuadro de dilogo; si se pulsa 'Cancel' devuelve una cadena vaca;
i) -->archivo=uiputfile(mscara, directorio inicial, ttulo del dilogo), dilogo para seleccionar un archivo para grabar datos; repitiendo el ejemplo anterior, para guardar el archivo 'misdatos.dat', contenido en la variable 'arch' que recin abrimos, escribimos: -->arch=uiputfile(*.dat,midir,Guardar archivo de datos); La funcin devuelve el nombre completo (el path) del archivo si se pulsa el botn Guardar del cuadro de dilogo; si se pulsa Cancelar devuelve una cadena vaca;
Si el archivo ya existe, la funcin despliega un mensaje adicional para asegurarse que el usuario desea reemplazar el archivo existente:
Si se pulsa 'Yes' la funcin devuelve el 'path' completo del archivo (en este ejemplo 'c:\CursoScilab\misdatos.dat'), si se pulsa 'No' devuelve una cadena vaca. OJO: las funciones anteriores no guardan nada, slo devuelven el 'path' de un archivo para leer o guardar datos. Para guardar las variables x1,x2,...xn en el archivo 'archivo' en formato binario usamos 'save': -->save(archivo,x1,x2,xn), guarda las variables x1,x2xn en el archivo archivo en formato binario; funcin simple que ahorra mucho trabajo de programacin para guardar matrices en archivos; por ejemplo: -->personal=[nombre-1; nombre-2; nombre-3]; -->edad=[25,46,33]; -->profesion=[estudiante,contador,agricultor];
9
La sentencia: -->save(arch,personal,edad,profesion]; guarda las matrices en el archivo 'misdatos.dat', cuyo 'path' (obtenido con la funcin 'uiputfile') est contenido en la variable 'arch',; k) -->load(archivo,x1,x2,xn), recupera variables del archivo guardadas con la funcin save; antes de recuperar los valores de las variables no aseguramos de que stas no existan, eliminando las variables 'personal', 'edad' y 'profesin', con la funcin 'clear': -->clear('personal', 'edad', 'profesion'); esta funcin elimina las variables personal edad y profesion que definimos antes; alternativamente podemos borrar todos los datos de estas matrices, sin eliminarlas, escribiendo: -->personal=[] -->edad=[] -->profesion=[] luego recuperamos las matrices guardadas en el archivo 'misdatos.dat', cuyo 'path' est contenido en la variable 'arch', escribiendo: -->load(arch), luego podemos inspeccionar si se recuperaron los datos: -->personal (muestra la matriz recuperada, y as las dems); Tambin podemos recuperar una o algunas de las matrices guardadas, no todas, escribiendo por ejemplo: -->load(arch,edad) recupera la matriz edad; los nombres de las matrices se guardan con los valores, por lo que debe usarse el mismo nombre con que se guard; ntese adems que los nombres de las variables argumentos deben estar entre comillas, lo que no se requiere en la funcin 'save'; l) -->print(archivo,x1,x2,xn), imprime en un archivo de texto (formato ASCII) las variables x1, x2, etc.; para guardar las matrices que definimos antes, escribimos: -->[carpeta,nom,ext]=fileparts(arch); obtenemos las partes del archivo arch que estamos usando: carpeta: directorio actual ('c:\CursoScilab\');nom: nombre ('misdatos'); ext: su extensin ('.dat'); -->archtexto=carpeta+nom+.txt; // creamos el path del archivo de texto donde imprimiremos las variables en formato ascii: -->print(archtexto,personal,edad,profesion); Podemos leer los datos impresos en el archivo archtexto usando el editor de textos de Scilab o el notepad de Windows. Esta funcin es til para guardar los datos en formato directamente legible. m) -->disp(x1,x2,xn) muestra en la ventana de comandos los valores de las variables; nota: las variables se muestran en orden inverso (es decir comienza por xn, luego xn-1 hasta x1);
10
n) -->mprintf(format,x1,x2,xn), muestra en la ventana de comandos los valores de las variables, con formato (equivale a la funcin printf de C), el formato sigue la sintaxis del lenguaje C; o) -->var=x_matrix(rtulos,var-inicial), cuadro de dilogo para editar matrices; por ejemplo, definimos una matriz nula de 3x4: -->matdatos=zeros(3,4) y un vector de cadenas de texto: -->titulos=[Matriz de datos (pulse OK para actulizar);var1, var2, var3, var4] -->matdatos=x_matrix(titulos,matdatos); la funcin devuelve en 'matdatos' la matriz 'matdatos' actualizada si se pulsa 'OK', si se pulsa 'Cancel' la matriz se anula (ojo con este comportamiento, que no es lo normal, ya que usualmente al cancelar una accin de edicin simplemente deberan restaurarse los valores originales de la variable)
p) Scilab incluye una macro (le llamamos as porque no responde a la declaracin de funcin que veremos ms adelante), muy til para editar matrices en formato de planilla electrnica sencilla. Se pueden escribir frmulas, operaciones, funciones, etc. en las celdas de esta planilla, pero no admite copiar y pegar, deshacer cambios, etc. -->editvar matdatos; // edita la matriz matdatos
a diferencia de la funcin x_matrix el cuadro de editvar es 'no modal', es decir que podemos volver al 'prompt' de Scilab y realizar otros clculos sin cerrar el cuadro; ste permanecer abierto y activo hasta que se pulse el botn 'Quit' que se muestra debajo del ttulo; la funcin no actualiza automticamente la variable que se est editando; deber pulsarse el botn 'Update to Scilab' para que los datos editados se reflejen en la memoria de Scilab; Si se desea modificar el tamao de la matriz que se est editando, puede hacerlo pulsando el botn 'Resize'; tambin el ancho de las columnas puede modificarse al modo de Excel, posicionando el cursor del ratn entre dos columnas en la lnea del encabezado de columnas, y pulsando el botn derecho del mouse. q) otra funcin similar a x_matriz es x_mdialog, con la cual se pueden editar vectores y matrices numricas o de texto, por lo que estas variables deben estar en formato de cadena de texto y no en valores numricos; si se editan nmeros deber evaluarse si los datos pueden convertirse a nmeros: para ello usamos la funcin evstr, como en el siguiente ejemplo:
Al pulsar 'OK' se cierra el cuadro de dilogo y evaluamos los datos numricos recogidos: -->valvars=evstr(txtvars); si no hay errores en el formato de los nmeros, los datos numricos se guardarn en el vector/matriz 'valvars'; si hay error Scilab levantar el error; en programacin este error debe interceptarse con el bloque 'try..catch' para evitar que se aborte nuestro programa (ver ms adelante, en 'Elementos de programacin').
12
r) -->selec=x_choose(tems,ttulo), cuadro de dilogo para seleccionar un item de una lista; por ejemplo, creamos la siguiente lista de opciones: -->items=['Opcin-1';'Opcin-2';'Opcin-3';'Opcin-4';'Opcin-5']; -->info=['Seleccione un item de la lista';'Doble-click para seleccionar']; Luego seleccionamos la opcin: -->itemsel=x_choose(items,info); muestra el cuadro siguiente:
Recordemos que el valor de itemsel no se muestra en pantalla si terminamos la sentencia con punto y coma (;), para observar el valor tecleamos: -->itemsel; el valor devuelto es el ndice del elemento seleccionado (el primer elemento es siempre el '1'). Debe observarse que para seleccionar un tem de la lista debe hacer doble-click sobre el tem, el cuadro slo tiene un botn 'Cancelar'; si se pulsa este botn, " itemsel" valdr cero. q) -->botonsel=messagebox(mensaje, titulo, cono, botones, modo) Esta funcin despliega un cuadro de dilogo con un ttulo, mostrando el mensaje, con uno o ms botones, de tipo modal o no modal. Ejemplo, definimos: -->msaje=Error en el procesamientoEl dato fff no corresponde; -->tit=Mensaje de mi programa; -->icono=error; -->botones=['Continuar,Abortar,Reiniciar]; -->modo=modal; Luego: -->botonsel=messagebox(msaje,tit,icono,botones,modo);
13
Muestra el cuadro de mensaje y devuelve en botonsel el ndice ordinal del botn pulsado: 1=Continuar; 2=Abortar; 3=Reiniciar; -->disp(botonsel); // muestra el ndice del botn pulsado
8. Elementos de programacin
Scilab tiene todos los elementos de programacin para propsitos generales que encontramos en C, Java, Pascal, Basic, etc., con pequeas (o grandes!) diferencias en la sintaxis: - Asignacin: = - Operadores de comparacin; ==, ~=, <, >, <=, >= - Operadores booleanos: | (or), & (and), ~ (not) - bloque de decisin: ifthenelseend; - bloque iterativo: fordoend; - bloque iterativo: whiledoend; - break permite romper el bloque y salir del mismo en cualquier momento; - Bloque de seleccin: select <var> case valor1 <instrucciones> case valor2 <instrucciones> else <instrucciones> end; En Scilab los programas se codifican en archivos de texto, y pueden ser de tipo script, con extensin ".sce", o una coleccin de funciones, con extensin .sci, o inclusive un script (.sce) que adems contiene funciones. Para editar un script o un archivo de funciones usamos el editor incorporado de Scilab: desde el men Applications/Editor, o tecleando editor en la ventana de comandos. Un "script" es simplemente una secuencia de sentencias, las mismas que hemos ejecutado interactivamente, las que ahora se ejecutarn secuencialmente desde la 1 a la ltima lnea del "script". Para ejecutar un archivo "script", utilizamos el comando File/Execute de la barra de mens, o bien escribiendo la funcin exec(archivo,[modo]) en la ventana de comandos (el parmetro archivo requiere el path completo si la funcin no est previamente cargada en Scilab), el argumento modo es opcional permitiendo ejecutar el script de varias formas. Al cargar un script ste se ejecuta inmediatamente, no as las funciones, las cuales se ejecutan solamente cuando se las llaman, sea desde el mismo script, desde otra funcin, o interactivamente, tecleando su nombre en la ventana de comandos.
14
Los archivos .sci que slo contienen funciones pueden compilarse y guardarse con extensin .bin (archivos compilados, en formato binario, usando la funcin genlib). En Scilab las funciones se declaran con la siguiente sintaxis: function [<parmetros_de_salida>]= <nombre_de_la_funcin>(<parmetros_de_ entrada>) Tanto las variables de salida como las de entrada admiten varios argumentos, incluso opcionales. El paso predeterminado de los argumentos de entrada es por valor y no por referencia, es decir la funcin crea una copia local de la variable pasada como argumento. Toda funcin debe terminar con la sentencia endfunction.
Luego, la funcin manejadora tiene este prototipo: function mis_eventos(comando) select comando case 1 then (instrucciones o funcin manejadora del evento 1) Case 2 then (instrucciones o funcin manejadora del evento 2) ... end; // select endfunction; Ejemplo: grabar el siguiente trozo de cdigo en el archivo MisEventos.sci: (ver Apndice A) Luego, ejecutar el archivo en Scilab, esto carga en memoria las funciones declaradas en dicho archivo; Finalmente, teclear la siguiente sentencia, que pone el men Mi menu en la barra de mens de Scilab, como se muestra en la siguiente pantalla. -->addmenu(Mi menu,[Registro;Mensaje;Seleccin],list(2,MisEventos));
Si se pulsa el comando 'Registro' se muestra el siguiente cuadro de dilogo, que permite obtener datos usando un formulario (el ejemplo usa la funcin x_mdialog estudiada antes).
16
El comando 'Mensaje' muestra un simple cuadro de mensaje con 2 botones; el comando 'Seleccin' muestra un cuadro de seleccin. En programacin, la sentencia addmenu se incluye en un script o funcin en un mdulo que es parte de la aplicacin. Slo debe llamarse una vez esta funcin, de lo contrario se cargar varias veces el men en la barra de mens. Por defecto, el men creado est habilitado para ser usado; cuando se desea inhabilitar el men o uno de sus comandos (porque el contexto de programa lo requiera), se usa la funcin unsetmenu: -->unsetmenu(men, [comando]) Men es el nombre del men, comando es opcional, y es el nombre del comando a inhabilitar, si no se especifica, se inhabilita todo el menu. Para volver a habilitar un men o comando del men, usar la funcin setmenu. Ver otros ejemplos de scripts y funciones en los apndices B y C En el apndice B el script incluye funciones, en el apndice C, el script y las funciones se ponen en archivos separados, y el script carga en Scilab (ejecuta) el archivo de funciones.
17
APENDICE A // funcin MisEventos: dispara una accin de acuerdo con el argumento pasado a la funcin function MisEventos(cmd) select cmd case 1 then Evento_1(); case 2 then Evento_2(); case 3 then Evento_3(); end; endfunction; function Evento_1() // gestiona un cuadro de dilogo para registrar usuario registropersona=['Nombre','Apellido','Edad','Profesin']; datospersona=['','','','']; listapersonal=[]; datosleidos=x_mdialog('Ingrese sus datos personales',registropersona, datospersona); disp(datosleidos); for col=1:4 do listapersonal(1,col)=datosleidos(col); end; disp('Apellido del usuario actual es ' + listapersonal(1,2)); endfunction; function Evento_2() // muestra un mensaje botones=['OK','Cancelar']; botonsel=messagebox('Se ha seleccionado el comando nro: 2','Mis eventos','info',botones,'modal'); disp('Botn pulsado= ' + botones(botonsel)); endfunction; function Evento_3() // gestiona un cuadro de seleccin listaOpciones=['Opcin 1';'Opcion 2';'Opcion 3']; opcselec=x_choose(listaOpciones,'Doble click sobre la opcin para seleccionar','Cancelar'); if(opcselec ~= 0) then // se ha seleccionado una opcin disp('Opcin elegida= '+ string(opcselec)); else disp('Seleccin cancelada por el usuario'); end; endfunction; // fin del archivo MisEventos.sci
18
APENDICE B // un script con funciones: editarcargas.sce // utiliza la funcin 'x_matrix' para editar una matriz de datos de cargas nodales // global PNodales; // define una matriz global con los datos de cargas nodales global ArchPN; // nombre del archivo donde se guardar la matriz // // cambiar directorio de trabajo midir=get_absolute_file_path('editarcargas.sce'); chdir(midir); // // valores iniciales de las variables PNodales=zeros(3,4); // crea la matriz, inicialmente 3x4, con valores nulos ArchPN=midir+'cargasPN.dat'; // cargasPN.dat es el nombre del archivo // // informacin inicial para el usuario clc; infoini=[' Programa: Editar Cargas Nodales'; ' '; ' Lista de comandos:'; ' nueva_hipot : para crear una matriz de cargas vaca'; ' leer_datos : para cargar los datos guardados'; ' editar_datos : para editar los datos de la matriz'; ' guardar_datos: para salvar los datos en archivo']; mprintf('%s\n',infoini); // function nueva_hipot global PNodales; PNodales=zeros(3,4); // crea la matriz, inicialmente vaca endfunction; // function leer_datos global PNodales; global ArchPN; load(ArchPN); endfunction; // function editar_datos global PNodales; info=['Editar cargas nodales'; 'Pulse OK para actualizar'; 'Nudo,___Px,___Py,___Mz']; PNodales=x_matrix(info,PNodales); endfunction; // function guardar_datos global ArchPN; save(ArchPN,PNodales); // guarda la matriz de datos en archivo endfunction;
19
APENDICE C // archivo: selectarea.sce // este script muestra en pantalla (no en la barra de mens) un men en forma // de lista de tareas; las funciones que se llaman desde aqu se definen en // el archivo selectarea.sci, el cual se carga desde aqu en la ltima lnea // definir variables globales clear; // borra todas las variables con el mismo nombre que las de este script global midir; global listamenu; global miarchdatos nomarchdatos; global midato1 midato2 midato3 midato4; // otras variables globales necesarias aqu... // inicializar variables globales... midir=''; miarchdatos=''; midato1=zeros(3,3); midato2=zeros(2,2); midato3=zeros(2,4); midato4=zeros(1,4); // directorio del usuario midir=get_absolute_file_path('selectarea.sce'); // cambiar directorio de trabajo chdir(midir); clc; // limpia la ventana de comandos // definir la lista de comandos del men listamenu=[' Programa: Mi Programa de Ejemplo'; ' Para analizar un modelo teclee uno de las siguintes comandos:'; ' '; ' menu : muestra este men de comandos'; ' tarea1 : inicia las matrices de datos'; ' tarea2 : edita las matrices de datos'; ' tarea3 : recupera datos de una matriz'; ' tarea4 : salva los datos en archivo'; ' terminar : borra todas las variables y termina el programa']; // mprintf('\t%s\n',listamenu); // muestra la lista de tareas en pantalla exec(midir + 'selectarea.sci'); // carga en memoria la biblioteca de funciones // fin del script
// archivo: selectarea.sci biblioteca de funciones para ejecutar // acciones de comandos de un men en pantalla (no en la barra de menus) // function menu global listamenu; clc; mprintf('\t%s\n',listamenu); endfunction; // // funcin tarea1: por ejemplo, inicia las matrices de 'midato1'...'midato4' // acepta el nombre para un archivo y guarda los datos en el mismo function tarea1 global midir miarchdatos nomarchdatos global midato1 midato2 midato3 midato4; nomarchdatos=''; nomarchdatos=x_dialog(['Escriba un nombre para el archivo de datos (sin extensin)'], nomarchdatos); if(nomarchdatos ~= []) then 20
miarchdatos=midir + nomarchdatos + '.dat'; midato1=rand(3,3); midato2=rand(2,2); midato3=rand(2,4); midato4=rand(1,4); save(miarchdatos, midato1, midato2, midato3, midato4); mprintf('%s\n','Se iniciaron la matrices de datos'); else mprintf('%s\n','No se iniciaron las matrices de datos'); end; endfunction; // // funcin tarea3: por ejemplo recupera la matriz 'midato3' del archivo // y lo edita (en este caso el nombre del archivo se obtiene mediante el // cuadro de dilogo de windows function tarea3 global midato3; miarchdatos=uigetfile(['*.dat'], midir, 'Seleccionar archivo de datos'); if(miarchdatos ~= ''); load(miarchdatos,'midato3'); midato3=x_matrix('Editando los datos de la matriz ''midato3''',midato3); else mprintf('%s\n','No se leyeron datos.'); end endfunction; // // funcin tarea2: por ejemplo seleccionar una matriz de datos para editar function tarea2 items=['Editar ''midato1'''; 'Editar ''midato2'''; 'Editar ''midato3''' 'Editar ''midato4''']; botonsel=x_choose(items,['Seleccione un item para editar'; 'Doble click sobre el item para aceptar']); select botonsel case 1 then editar1; case 2 then editar2; case 3 then editar3; case 4 then editar4; end; endfunction // // funcin editar1: edita los datos de la matriz 'midato1' function editar1 global midato1; item=['Editando mis datos ''midato1'''; 'Col1, Col2, Col3']; midato1=x_matrix(item,midato1); endfunction; // // funcin editar2: edita los datos de la matriz 'midato2' function editar2 global midato2; item=['Editando mis datos ''midato2'''; 'Col1, Col2']; midato2=x_matrix(item,midato2); endfunction; // // funcin editar3: edita los datos de la matriz 'midato3' 21
function editar3 global midato3; item=['Editando mis datos ''midato3'''; 'Col1, Col2, Col3, Col4']; midato3=x_matrix(item,midato3); endfunction; // // funcin editar4: edita los datos de la matriz 'midato4' function editar4 global midato4; item=['Editando mis datos ''midato4'''; 'Col1, Col2, Col3, Col4']; midato4=x_matrix(item,midato4); endfunction; // // funcin tarea4: por ejemplo, salva los datos de las matrices en // formato binario y en formato texto function tarea4 global miarchdatos midato1 midato2 midato3 midato4; if(nomarchdatos == []) then miarchdatos=uiputfile(['*.dat'], midir,'Guardar los datos de la estructura'); end; if(miarchdatos ~='') then // nombre para el archivo de texto [midir,nomarch,ext]=fileparts(miarchdatos); miarchtexto=midir+nomarch+'.txt'; save(miarchdatos,midato1, midato2, midato3, midato4); // eliminar el archivo de texto existente antes de re-escribirlo if(isfile(miarchtexto)) then mdelete(miarchtexto); end; print(miarchtexto, midato4, midato3, midato2, midato1); mprintf('%s\n','Se guardaron los datos'); editor(miarchtexto); else mprintf('%s\n','No se guardaron los datos'); end; endfunction; // function terminar clearglobal(); mprintf('%s\n','Final de sesin de ''selectarea'''); endfunction;
22
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
Se han usado los siguientes lenguajes y sus EID respectivos (un objetivo adicional es usar solamente software libre, que puede bajarse gratuitamente de Internet); el sistema operativo usado es Windows-XP, pero, con excepcin de lcc, estos lenguajes son multiplataformas: 1) Lenguaje: Free Basic; compilador: fbc.exe; EID: FBEdit.exe y/o Fbide.exe; 2) Lenguaje: Free Pascal; compilador: fpc.exe; EID: propio de Free Pascal (fp.exe); 3) Lenguaje: C; compilador: lcc (para win32); EID: wedit.exe; 4) Lenguaje: Python; interpretado; EID: IDLE (de Python.org) 5) Lenguaje: Scilab; interpretado; EID: wscilex.exe (propio de Scilab); Otras aplicaciones de clculos matemticos similares a Scilab tambin se han incluido en la comparativa. Aunque en este caso simple no existen casi diferencias (los cdigos apenas se diferencian en las puntuaciones), Scilab tiene algunas funciones que las otras aplicaciones no tienen y que son tiles para crear mens, cuadros de dilogo, editor de matrices, etc. 6) 7) 8) Lenguaje: Octave; interpretado; EID: QtOctave.exe; Lenguaje: FreeMat; interpretado; EID: FreeMat.exe; Lenguaje: Euler; interpretado; EID: Euler.exe;
El problema planteado es resolver un sistema de 6 ecuaciones lineales. El proceso de resolucin utilizado en los programas 1) a 4) es el de
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
Gauss-Jordn. Las aplicaciones de clculo numrico 5) a 8) utilizan ste y otros mtodos para optimizar la solucin. mk*x=p; cuyos elementos se obtienen con las siguientes formulas:
mk(i,i)=10*i; para 0<i<7 mk(i,j)=3*fila; para 0<i<7; i+1<j<7 mk(j,i)=mk(i,j); resulta una matriz simtrica de banda p(i)=i; para 0<i<7 las matrices mk y el vector p: 0. 6. 30. 9. 0. 0. 0. 0. 9. 40. 12. 0. 0. 0. 0. 12. 50. 15. 0. 0. 0. 0. 15. 60.
La solucin es el vector p= 0.0795216 0.0682613 0.0660348 0.0677099 0.0581077 0.0854731 A seguir trascribimos los diferentes cdigos mencionados. Puede observarse que las aplicaciones para clculos matemticos, Scilab, Octave, FreeMat, y Euler tienen la menor cantidad de lineas de cdigo y la sintaxis ms simple.
1. Free Basic
Free Basic compila y crea un auto-ejecutable (ecuac.exe) que se puede llamar desde la lnea de comandos en una ventana del sistema, la cual se abre desde el men Tools/Command Prompt en el editor FbEdit.
' programa ecuac.bas: solucion de un sistema lineal con Free Basic ' ' variables globales, matrices y vectores dinmicos
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
' dim shared mk() As Double dim shared p() As Double declare sub calc_raices() ' declara el procedimiento que se implementar abajo declare sub imprimirvars() ' procedimiento para imprimir las matrices ' ejecutar el programa redim mk(6,6) ' define el tamao de la matriz dinmica redim p(6) ' idem del vector p ' cls ' limpia la pantalla calc_raices ' ejecuta el clculo del sistema imprimirvars ' imprime las matrices en un archivo de texto ' fin del programa ' implementacin de la subrutina calc_raices '------------------------------------------------------------------Sub calc_raices() ' Dim fpiv As Integer, fila As Integer, col As Integer ' iniciar valores nulos de la matriz y vector For fila = 1 To 6 For col = 1 To 6 mk(fila, col) = 0 Next p(fila) = 0 Next ' asignando valores de la matriz mk For fila = 1 To 6 col = fila mk(fila, col) = 10 * fila Next For fila = 1 To 5 col = fila + 1 mk(fila, col) = 3 * fila mk(col, fila) = 3 * fila Next ' mostrar en pantalla la matriz mk print "Matriz del sistema" print For fila = 1 To 6 For col = 1 To 6 print using "########.##"; mk(fila, col); Next print Next print ' asignando valores al vector p print "Vector del sistema" print For fila = 1 To 6 p(fila)=fila ' mostrar valores de p print using "######.##"; p(fila) Next print
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
' ' resolviendo el sistema mk*x=p ' for fpiv=1 to 6 for fila=1 to 6 if(fila<>fpiv) then for col=(fpiv+1) to 6 mk(fila,col)=mk(fila,col)mk(fila,fpiv)*mk(fpiv,col)/mk(fpiv,fpiv) next p(fila)=p(fila)-mk(fila,fpiv)*p(fpiv)/mk(fpiv,fpiv) end if next ' for fila for col=(fpiv+1) to 6 mk(fpiv,col)=mk(fpiv,col)/mk(fpiv,fpiv) next ' for col p(fpiv)=p(fpiv)/mk(fpiv,fpiv) next ' for fpiv ' imprimir en pantalla los resultados print "Solucin del sistema" print for fila=1 to 6 print using "#.########"; p(fila) next ' End Sub -----------------------------------------------------------------------' imprimir variables en archivo sub imprimirvars() dim nomdir as string, nomarchdat as string dim fila as integer, col as integer nomdir=curdir nomarchdat=nomdir+"\archdatos.txt" open nomarchdat for output as #1 print #1, "Matriz reducida del sistema" print #1, for fila=1 to 6 for col=1 to 6 print #1, using "####.#####"; mk(fila,col), next print #1, next print #1, print #1,"Solucin del sistema" print #1, for fila=1 to 6 print #1, using "#.########"; p(fila) next print #1, close #1 Print Print "Las matrices se imprimieron en el archivo:" Print nomarchdat end sub
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
2. Free Pascal
El archivo se compila creando un auto-ejecutable (ecuac.exe). Este se puede correr desde el editor fp y ver los resultados en consola usando el men Debug/User Screen o pulsando Alt/F5.
program ecuac; {$APPTYPE CONSOLE} uses SysUtils,Crt, objPas; var mk: array[1..6,1..6] of double; P: array[1..6] of double; //--------------------------------------------------------------------------procedure calc_raices; var fpiv, fila, col: integer; begin // valores iniciales nulos de los elementos de las matrices for fila:=1 to 6 do begin for col:=1 to 6 do mk[fila,col]:=0; p[fila]:=0; end; // asignando valores a la matriz mk for fila:=1 to 6 do begin col:=fila; mk[fila, col]:= 10*fila; end; for fila:=1 to 5 do begin col:=fila+1; mk[fila,col]:=3*fila; mk[col, fila]:=3*fila; end; // mostrar en pantalla la matriz mk clrscr; writeln; writeln('Matriz del sistema'); writeln; for fila:=1 to 6 do begin for col:=1 to 6 do write(mk[fila,col]:10:1); writeln; end; writeln; // asignando valores al vector P y mostrando en pantalla writeln; writeln('Vector del sistema'); writeln; for fila:=1 to 6 do begin
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
P[fila]:=fila; writeln(P[fila]:10:1); end; writeln; // resolviendo K*x=P for fpiv:=1 to 6 do begin for fila:=1 to 6 do begin if (fila<>fpiv) then begin for col:=(fpiv+1) to 6 do mk[fila,col]:=mk[fila,col]mk[fila,fpiv]*mk[fpiv,col]/mk[fpiv,fpiv]; P[fila]:=P[fila]-mk[fila,fpiv]*P[fpiv]/mk[fpiv,fpiv]; end; end; for col:=(fpiv+1) to 6 do mk[fpiv,col]:=mk[fpiv,col]/mk[fpiv,fpiv]; P[fpiv]:=p[fpiv]/mk[fpiv,fpiv]; end; // imprimir en pantalla los resultados writeln; writeln('Solucin del sistema'); writeln; for fila:=1 to 6 do writeln(P[fila]:10:8); end; // //----------------------------------------------------------------------------procedure imprimirvars; var archtxt:text; fpdir, nomarch: string; fila, col: integer; // begin getdir(0,fpdir); nomarch:=fpdir+'\archdatos.txt'; assignfile(archtxt, nomarch); rewrite(archtxt); writeln(archtxt,'Matriz reducida'); writeln(archtxt); for fila:=1 to 6 do begin for col:=1 to 6 do write(archtxt,mk[fila,col]:12:8); writeln(archtxt); end; writeln(archtxt); writeln(archtxt,'Solucin del sistema'); writeln(archtxt); for fila:=1 to 6 do writeln(archtxt,P[fila]:12:8); writeln(archtxt); close(archtxt); writeln; writeln('Las matrices se imprimieron en el archivo:');
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
writeln(nomarch); end; // //--------------------------------------------------------------------------begin // resolver el sistema calc_raices; // imprimir matriz y vector imprimirvars end.
3. C (con lcc)
El archivo se compila creando un auto-ejecutable (ecuac.exe), el cual puede correrse desde el editor con el comando del men Compiler/Execute ecuac.exe lo cual abre una ventana del sistema para mostrar los resultados en consola.
/* ecuac.c: ejemplo de solucin de un sistema lineal */ #include<stdio.h> #include<tcconio.h> #include<direct.h> #include<string.h> #include<stdlib.h> double mk[6][6]; double p[6]; char *nomarch="\\archdatos.txt"; FILE *archtxt; void calc_raices(void) { int fpiv, fila, col; /* valores nulos de los elementos de las matrices */ for (fila=1; fila<=6; fila++) { for (col=1; col<=6; col++) mk[fila][col]=0; p[fila]=0; } /* asignando valores a la matriz mk */ for (fila=1; fila<=6; fila++) { col=fila; mk[fila][col]=10*fila; } for (fila=1; fila<=5; fila++) { col=fila+1; mk[fila][col]=3*fila; mk[col][fila]=3*fila; } /* mostrar en pantalla la matriz */
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
printf("%s","Matriz del sistema\n\n"); for (fila=1; fila<=6; fila++) { for (col=1; col<=6; col++) printf("%10.1f",mk[fila][col]); printf("\n"); } printf("\n"); /* asignar valores al vector p y mostrar en pantalla */ printf("%s","\nVector del sistema\n\n"); for (fila=1; fila<=6; fila++) { p[fila]=fila; printf("%10.1f\n",p[fila]); } printf("\n"); /* resolviendo el sistema mk*x=p */ for (fpiv=1; fpiv<=6; fpiv++) { for (fila=1; fila<=6; fila++) { if(fila != fpiv) { for (col=(fpiv+1); col<=6; col++) mk[fila][col]=mk[fila][col]mk[fila][fpiv]*mk[fpiv][col]/mk[fpiv][fpiv]; p[fila]=p[fila]-mk[fila][fpiv]*p[fpiv]/mk[fpiv][fpiv]; } } for (col=(fpiv+1); col<=6; col++) mk[fpiv][col]=mk[fpiv][col]/mk[fpiv][fpiv]; p[fpiv]=p[fpiv]/mk[fpiv][fpiv]; } /* imprimir en pantalla los resultados */ printf("%s","\nSolucion del sistema\n\n"); for (fila=1; fila<=6; fila++) printf("%10.8f\n",p[fila]); } //----------------------------------------------------------------------void imprimirvars(void) { int fila, col; char *pathc; pathc=getcwd(NULL,1024); strcat(pathc,nomarch); // printf("\n%s %s\n",pathc, nomarch); if((archtxt=fopen(pathc,"w"))==NULL) { printf("No se puede abrir el archivo"); exit(1); } fprintf(archtxt,"%s\n","Matriz reducida del sistema"); fprintf(archtxt,"\n"); for (fila=1; fila<=6; fila++) {
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
for(col=1; col<=6; col++) fprintf(archtxt,"%12.8f",mk[fila][col]); fprintf(archtxt,"\n"); } fprintf(archtxt,"\n"); fprintf(archtxt,"\n%s\n","Solucin del sistema"); fprintf(archtxt,"\n"); for (fila=1; fila<=6;fila++) fprintf(archtxt,"%12.8f\n",p[fila]); fprintf(archtxt,"\n"); fclose(archtxt); printf("Las matrices se imprimieron en el archivo:\n"); printf("%s",pathc); } //---------------------------------------------------------------------int main(void) { clrscr; calc_raices(); imprimirvars(); return 0; }
4. Python
El archivo ecuac.py no se compila. Se corre dentro del entorno integrado y los resultados se muestran en la ventana del editor. Tambin puede correrse desde la lnea de comandos de una ventana del sistema escribiendo python ecuac.py que muestra los resultados en la consola (se requiere agregar python.exe en el path del sistema o del usuario).
# -*- coding: cp1252 -*# programa ecuac.py: solucion de un sistema lineal usando Python # variables globales, matrices y vectores dinamicos # iniciar valores nulos de la matriz import os # mk=[0.0]*7 for fila in range(7): mk[fila]=[0.0]*7 # iniciar valores nulos del vector p=[0.0]*7 # asignando valores a los elementos de mk for fila in range(1,7): col=fila mk[fila][col]=10.0*fila for fila in range(1,6): col=fila+1 mk[fila][col]=3.0*fila mk[col][fila]=3.0*fila # mostrar la matriz mk print 'Matriz del sistema\n' for fila in range(1,7):
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
for col in range(1,7): print mk[fila][col], print # asignando valores a los elementos de p for fila in range(1,7): p[fila]=fila # mostrando p en pantalla print '\nVector del sistema\n' for fila in range(1,7): print p[fila] # resolviendo el sistema mk*x=p for fpiv in range(1,7): for fila in range(1,7): if(fila!=fpiv): for col in range(fpiv+1,7): mk[fila][col]=mk[fila][col]mk[fila][fpiv]*mk[fpiv][col]/mk[fpiv][fpiv] p[fila]=p[fila]-mk[fila][fpiv]*p[fpiv]/mk[fpiv][fpiv] for col in range(fpiv+1, 7): mk[fpiv][col]=mk[fpiv][col]/mk[fpiv][fpiv] p[fpiv]=p[fpiv]/mk[fpiv][fpiv] # mostrar en pantalla el resultado print '\nSolucin del sistema\n' for fila in range(1,7): print p[fila] # imprimir las matrices en un archivo pitondir=os.getcwd() nomarchdat=pitondir+'\\archdatos.txt' arch=open(nomarchdat,'w') arch.write('Matriz reducida del sistema\n') arch.write('\n') for fila in range(1,7): for col in range(1,7): arch.write('%10.6f' %(mk[fila][col])) arch.write('\n') arch.write('\nSolucion del sistema\n') arch.write('\n') for fila in range(1,7): arch.write('%10.6f \n' %p[fila]) arch.close() print '\nLas matrices se imprimieron en el archivo:\n' print nomarchdat # fin del script
5. Scilab
El archivo no se compila, slo se interpreta desde el EID de Scilab; los resultados se muestran en la ventana de comandos de Scilab. Puede compilarse en un archivo ecuac.bin, que no es auto-ejecutable y slo se corre dentro de Scilab.
// ecuac.sce: resuelve un sistema lineal
10
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
clc; // iniciando las matrices mk=zeros(6,6); p=zeros(6); // generando los trminos diagonales de mk for fila=1:6 do col=fila; mk(fila,col)=10*fila; end; // generando los otros trminos de mk for fila=1:5 do col=fila+1; mk(fila,col)=3*fila; mk(col,fila)=3*fila; end; // generando los valores de p for fila=1:6 do p(fila)=fila; end; // mostrando en pantalla las variables disp('Matriz del sistema:'); disp(mk); disp('Vector del sistema:'); disp(p); // resolviento el sistema p=mk\p; // mostrando el resultado disp('Solucin del sistema:'); disp(p); // guardando la solucin del sistema en un archivo de texto midir=get_absolute_file_path('ecuac.sce'); miarch=midir + 'archdatos.txt'; info='Solucin del sistema'; deletefile(miarch); // destruir el archivo anterior, si existe // grabar los nuevos datos print(miarch,p, mk, info); disp('La solucin se guard en el archivo: ' + miarch); // fin del script
6. Octave
Igual que Scilab, el archivo se interpreta dentro del entorno de Qtoctave. Alternativamente puede correrse desde la linea de comandos de una ventana del sistema con la orden octave ecuac.m (requiere que octave.exe est en el path del sistema o del usuario).
# ecuac.m: resuelve un sistema lineal clc; mk=zeros(6,6); p=zeros(6,1); # asingnado valores de la diagonal de mk for fila=1:6 col=fila; mk(fila,col)=10*fila; endfor; # asignando valores a otros terminos de mk
11
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
for fila=1:5 col=fila+1; mk(fila,col)=3*fila; mk(col,fila)=3*fila; endfor; # asingando valores a p for fila=1:6 p(fila,1)=fila; endfor; # mostrando en pantalla las variables disp('Matriz del sistema'); disp(mk); disp('Vector del sistema'); disp(p); # resolviendo el sistema p=mk\p; # mostrando el resultado disp('Solucin del sistema'); disp(p); # grabando las matrices en un archivo de texto archdat="c:\\cursoscilab\\otrosides\\qtoctave\\archdatos.txt" save("-ascii",archdat","mk","p"); # fin del script
7. FreeMat
Igual que Scilab y Octave, el archivo requiere el interprete/IDE FreeMat.exe. No se ejecuta desde la linea de comandos de una ventana del DOS.
% ecuac.m: resuelve un sistema lineal clc; mk=zeros(6,6); p=zeros(6,1); for fila=1:6 col=fila; mk(fila,col)=10*fila; end; % asignando valores a mk for fila=1:5 col=fila+1; mk(fila,col)=3*fila; mk(col,fila)=3*fila; end; % asingando valores a p for fila=1:6 p(fila,1)=fila; end; % mostrando en pantalla las variables disp('Matriz del sistema'); disp(mk); disp('Vector del sistema'); disp(p); % resolviendo el sistema p=mk\p; % mostrando el resultado disp('Solucin del sistema');
12
J.L.Volta/AnlisismatricialdeestructurasconScilabParte1
disp(p); % grabando los datos en archivo info1='Matriz del sistema'; info2='Solucin del sistema'; archdatos='c:\cursoscilab\otrosides\freemat\archdatos.txt'; archtxt=fopen(archdatos,'w'); fprintf(archtxt,'%s\n',info1); for fila=1:6 for col=1:6 fprintf(archtxt,'%10.6f',mk(fila,col)); end; fprintf(archtxt,'\n'); end; fprintf(archtxt,'%s\n',info2); for fila=1:6 fprintf(archtxt,'%10.6f\n',p(fila)); end; fclose(archtxt); disp('Las matrices se guardaron en el archivo:'); disp(archdatos); % fin del script
8. Euler
Igual que FreeMat, el archivo requiere el interprete Euler.exe. No se ejecuta desde la linea de comandos de una ventana del DOS.
// ecuac.e: resuelve un sistema lineal con Euler // limpiando la ventana de comandos function ecuac() shortformat; cls; // iniciando matriz y vector a cero mk:=zeros(6,6); p:=zeros(6,1); // asignando valores a la diagonal de la matriz mk for fila=1 to 6; col:= fila; mk[fila,col] := 10*fila; end; // asignando valores fuera de la diagonal de mk for fila=1 to 5; col:=fila+1; mk[fila,col]:=3*fila; mk[col,fila]:=3*fila; end; // asignando valores al vector p for fila=1 to 6; p[fila,1]:=fila; end; // mostrando en pantalla las variables shortformat; "Matriz del sistema" mk "Vector del sistema" p // resolviendo el sistema p:=mk\p;
13