|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - patpite
Páginas: [1]
1
« en: Lunes 25 de Abril de 2005, 10:24 »
Otro detalle: la función que ese algoritmo trata de minimizar es la siguiente (aunque he quitado código que entorpecería ver la "esencia" de la función): /*********************************************************************************** * Método que implementa la función error: E * ***********************************************************************************/ public static double funcionE(int ident,double cte,double p1,double p2,double p3,double p4,double p5,double p6) { double Iteor = 0; double Err = 0; double T = Temperatura; double Vexp; double Iexp; for(int j=0; j<Mpuntos-N;j++) { Vexp = (double)puntosGrupo[ident][0,j]; Iexp = (double)puntosGrupo[ident][1,j]; // Calculo la Iteor Iteor = Math.Abs(cte - ( p1*(Math.Exp((e*Vexp-p5*Iexp)/p3*k*T)-1) + p2*(Math.Exp((e*Vexp-p5*Iexp)/p4*k*T)-1) + (Vexp-p5*Iexp)/p6 )); // Calculo el error para ese punto concreto Err = Math.Pow(((Iexp-Iteor)/Iexp),2); // Lo sumo a la func. error global para el grupo tratado funcE = funcE + Err; }//endfor return funcE; }//endmethod
He visto que no parece cargar bien en "funcE" lo que calcula en "Err". He hecho alguna prueba relacionada con "limpiar" el contenido de algunas variables, pero no doy con la solución. ¿Alguna sugerencia, por favor? Saludos, Patricia, a punto de ahorcarse con el cable de red.
2
« en: Sábado 23 de Abril de 2005, 19:49 »
Bueno... esta es la página donde viene el algoritmo que he empleado. Se llama "amoeba": sirve para minimizar funciones. Aquí viene codificado en Fortran y en C. (También lo encontré en VB). Algortimo AmoebaY mi codificación en C# del amoebilla ha sido la siguiente (al que se moleste en echarle un vistazo y me diga si hay un error o algo que no cuadre, le hago un monumento!!!!) using System; using System.Data; using System.Data.OleDb; using System.ComponentModel; using System.Windows.Forms; using Andromeda.clases; namespace Andromeda.clases { /// <summary> /// Descripción breve de Amoeba. /// </summary> public class Amoeba { /* Definiciones de Variables y Constantes*/ public Amoeba(){} /* Devuelve punto de evaluacion*/ public static void Get_Msum(int n,double[] Msum) { int ndim = n; // Curva oscuridad, n = 6; mpts = 7 int mpts = ndim + 1; double sum; int i; for(int j=0;j<=ndim-1;j++) // Recorre las 6 columnas de M { for(sum = 0.0, i=0;i<=mpts-1;i++) // Recorre las 7 filas de M sum = sum + Andromeda.clases.comun.M[i,j]; Msum[j]=sum; //Msum tiene 6 posiciones } } /* Intercambio de valores*/ public static void SWAP(double a, double B) { double aux = 0; aux = a; a = b; b = aux; } /* Función "Amotry"*/ public static double amotry(int ident,double cte,double[,] M,double[] y,double Msum,int n,int ihi,int nfunk,double fac) { int j; double fac1; double fac2; double ytry; double[] ptry; int ndim = n; ptry = new double[ndim+1]; fac1 = (1.0-fac)/ndim; fac2 = fac1-fac; for(j=0;j<=ndim-1;j++) ptry[j]=Msum[j]*fac1-M[ihi,j]*fac2; ytry = Andromeda.clases.comun.funcionE(ident,cte,ptry); //Función a minimizar if(ytry < y[ihi]) { y[ihi]=ytry; for(j=0;j<=ndim-1;j++) { Msum[j] = Msum[j] + ptry[j]-M[ihi,j]; M[ihi,j]= ptry[j]; } } return ytry; }//endmethod /*FUNCION "amoeba" */ public static void amoeba(int ident,double cte,double[,] M,double[] y,int ndim,double ftol) { // Zona de declaración de variables int i,ihi,ilo,inhi,j,mpts; double rtol,ysave,ytry; // sum? int nfunk; // Zona de declaración de constantes const int NMAX = 5000; const int ITMAX = 100; const double TINY = 1.0E-10; // Zona de inicialización de variables double[] Msum = new double[ndim+1]; mpts = ndim +1; nfunk = 0; Get_Msum(ndim,Msum); for(;;) { ilo = 0; if(y[0]>y[1]) { inhi = 1; ihi = 0; } else { inhi = 0; ihi = 1; } for(i=0; i<=mpts-1; i++) { if(y[i] <= y[ilo]) ilo = i; if(y[i]>y[ihi]) { inhi = ihi; ihi = i; }else if(y[i]>y[inhi] && i!=ihi) inhi = i; }//endfor rtol = 2.0*Math.Abs(y[ihi]-y[ilo])/(Math.Abs(y[ihi])+Math.Abs(y[ilo])+TINY); if(rtol < ftol) { SWAP(y[0],y[ilo]); for(i=0; i<=ndim-1; i++) SWAP(M[0,i],M[ilo,i]); break; }//endif if( nfunk >= NMAX) { // EN CASO DE ERROR: return; } nfunk= nfunk+2; // Aquí comienza una nueva iteración ytry = amotry(ident,cte,M,y,Msum,ndim,ihi,nfunk,-1.0); if(ytry <= y[ilo]) { ytry = amotry(ident,cte,M,y,Msum,ndim,ihi,nfunk,2.0); } else if(ytry >= y[inhi]) { ysave = y[ihi]; ytry = amotry(ident,cte,M,y,Msum,ndim,ihi,nfunk,0.5); if(ytry >= ysave) { for(i=0; i<=mpts-1; i++) { if(i!=ilo) { for(j=0; j<=ndim-1; j++) M[i,j] = Msum[j]=0.5*(M[i,j]+M[ilo,j]); y[i] = Andromeda.clases.comun.funcionE(ident,cte,Msum); }//endif }//endfor nfunk = nfunk + ndim; Get_Msum(ndim,Msum); }//endif }//endif else --nfunk; }//endfor } }
3
« en: Domingo 17 de Abril de 2005, 21:06 »
Pues a ver... tengo que meter en un programa que he hecho yo una parte de código que ya ha sido creada (en concreto, el algoritmo amoeba, del Numerical Recipes). Este código lo tengo escrito en Visual Basic, Fortran y C. Y el de C lleva punteros.
Tengo que "adaptarlo" para C#, y como no me funciona, he pensado que posiblemente sea porque necesita del uso del punteros. Pero el caso es que ni en VB ni en Fortran los emplea.
¿Alguna sugerencia?
Gracias.
Patri.
4
« en: Domingo 10 de Abril de 2005, 21:07 »
Hola,
¿Alguien podría decirme cómo se introduce código de c++ en una aplicación c#? ¿tiene muchos inconvenientes?
Saludos,
Patricia.
5
« en: Miércoles 16 de Febrero de 2005, 20:05 »
Hola a todos,
A ver si podéis echarme una mano: necesito que mi programa, antes de empezar a hacer nada, cargue una base de datos (access), a partir de la cual sacaré la información. ¿cómo se haría esto, con un cuadro de diálogo en plan "abrir fichero? ¿cómo se usan y manejan?
Al decir "cargar" me refiero a que debería guardar el path de la base de datos en el campo "Data Source" de la siguiente orden:
_conexion=new System.Data.OleDb.OleDbConnection(); _conexion.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;" + "Password=\"\"; " + "User ID=Admin; " + "Data Source=C:\\bd1.mdb;";
¿Alguien sabe cómo puedo hacer esto?
Gracias!
Patricia.
6
« en: Sábado 29 de Enero de 2005, 21:47 »
Hola a todos,
¿Alguno conoce alguna Expresión Regular que permita dar por válidos números reales en notación científica? Estoy probando con la siguiente:
\b[-+]?((\b[0-9]+)?[.])?\b[0-9]+([eE][-+]?[0-9]+)?\b
pero me da problemas; y aunque consiga que la acepte, no me hace ni caso cuando hago pruebas para que dé error.
¿Alguna ayuda?
¡Gracias!
Patricia.
7
« en: Lunes 10 de Enero de 2005, 19:40 »
Gracias por el consejo, JuanK, a ver si consigo arreglarlo... Y ya que estamos, me gustaría saber tu opinión y la de más gente que leyera esto. El problema de los factoriales que os comento viene dado por lo siguiente: ese numerazo monstruoso que da al calcular el factorial es el número de operaciones que debe hacer el programilla que estoy haciendo. Es decir: factorial(X) =10^9 ==> 10^9 operaciones que tiene que hacer. (Son operaciones de ajuste de parámetros). Si, por ejemplo, tardase 1 décima de segundo en hacer cada operación, el tiempo total sería... ¡más de tres años en acabar de ajustar! Bajo mi punto de vista, para un simple ajuste de parámetros (que es de lo que va el proyecto), considerar tantas operaciones me parece una salvajada (entre otras cosas porque me parece a mí que el ordenador empezaría a echar humo a las dos o tres semanas de estar haciendo cálculos como un poseso) ¿Os parece buena idea amenazar a mi tutor de proyecto con tirarme por un puente si me obliga a considerar como posible la opción de que mi programa realice todos esos cálculos? ¿alguno sabe de un puente efectivo?
8
« en: Domingo 9 de Enero de 2005, 16:56 »
Necesito vuestra ayuda urgentemente!!
He de calcular factoriales de números como 50 y 100. Los resultados que obtengo son números (double) del orden de 2.6x10^64. Esos números tienen que ser índices en un array, pero claro, me da error de desbordamiento.
La cosa va de lo siguiente: formo grupos (por ejemplo, 2.64x10^64 grupos en total), y para cada uno de ellos hago una serie de operaciones. Tengo que recorrer un array de 0 a 2.64x10^64 y....¡¡ÑECCK!! error de desbordamiento!
¿Se os ocurre alguna otra solución? Si no lo arreglo, proyecto fin de carrera a tomar por saco...........
Gracias.
9
« en: Domingo 5 de Diciembre de 2004, 16:11 »
Hola a todos,
Necesito vuestra ayuda de forma urgente. Mi problema es el siguiente: tengo un conjunto de M puntos, y he de formar grupos con ellos, agrupándolos de F en F. Usando combinatoria, sé que se forman G grupos, pero no sé cómo codificar un algoritmo que construya esos grupos.
Pondré un ejemplo para intentar aclararlo:
- Defino una variable N=1. Tengo M=3 puntos. Quiero hacer grupos con ellos, y que cada grupo tenga F=(M-N)=2 puntos. El resultado sería:
Puntos: a,b,c. Grupo1 = (a,B) Grupo2 = (a,c) Grupo3 = (b,c)
Hay una función combinatoria que se escribe algo así como "M sobre N" y que me calcula el número de grupos que saldrían, que en este caso serían 3. Eso lo sé hacer. Lo que no sé hacer es COMO FORMAR los grupitos, cómo asociar los puntos de forma correcta.
Estoy intentándolo con bucles for anidados, pero no acierto con la solución. Y la solución debe valer para cualquier valor que le demos a M y N. No sé si es una solución sencilla, o si emplea recursividad o qué.
Por favor!! Ayuda!!
Gracias!
Patricia.
10
« en: Domingo 5 de Diciembre de 2004, 13:20 »
No hay forma, Serghio  Estoy intentándolo con dos bucles for anidados, pero no hay manera. ¡AGH! Necesito ayuda, porque sin ese paso me quedo atascada y no puedo seguir para terminar el proyecto. ¡Por favor! ¡Ayudaaaa!
11
« en: Jueves 2 de Diciembre de 2004, 19:36 »
Uauhh Serghio... las 5.12 am.. no me extraña que tengas sueño Mira, en otro foro me han puesto esto como posible solución (aún no la he probado): M = 10 N = 1 F = M - N S = M FOR I = 1 TO M FOR J=1 TO F IF J = S G += S ELSE G+= J NEXT J G = STRING.EMPTY S = S - 1 NEXT I Como ejemplo más pequeño... a ver... hum... - Defino una variable N=1. Tengo M=3 puntos. Quiero hacer grupos con ellos, y que cada grupo tenga (M-N)=2 puntos. El resultado sería: Puntos: a,b,c. Grupo1 = (a,B) Grupo2 = (a,c) Grupo3 = (b,c) Hay una función combinatoria que se escribe algo así como (M N) y que me calcula el número de grupos que saldrían, que en este caso serían 3. Eso lo sé hacer. Lo que no sé hacer es COMO FORMAR los grupitos, cómo asociar los puntos de forma correcta
12
« en: Jueves 2 de Diciembre de 2004, 00:14 »
Hola a todos, a ver si me podéis echar una manilla con esto...
Tengo un conjunto de M puntos, y tengo que hacer grupos con ellos. Cada grupo va a tener N-M puntos. En total (aplicando úna fórmula combinatoria -M sobre N-) se formarán G grupos.
Sé cuántos grupos se me formarán, pero no sé cómo formar cada uno de esos grupos, es decir: cómo poner los (N-M) puntos en cada grupo.
Os pongo un ejemplo:
Sea N= 1. Tengo M=10 puntos en total. Quiero que cada grupo tenga M-N=10-1=9 puntos. Aplico combinatoria y sé que se formarán (10 sobre 1) = 10 grupos.
Llamamos a los puntos: (1,2,3, ..., 9,10)
Sé que los grupos que se forman son:
G1 = (1,2,3,4,5,6,7,8,9) G2 = (1,2,3,4,5,6,7,8,10) G3 = (1,2,3,4,5,6,7,10,9) G4 = (1,2,3,4,5,6,10,8,9) G5 = (1,2,3,4,5,10,7,8,9) G6 = (1,2,3,4,10,6,7,8,9) G7 = (1,2,3,10,5,6,7,8,9) G8 = (1,2,10,4,5,6,7,8,9) G9 = (1,10,3,4,5,6,7,8,9) G10 = (10,2,3,4,5,6,7,8,9)
Ahora: ¿cómo sería el código que me permitiera crear esos grupos Gi, para el caso general con M y N como datos? (aparte de los puntos, claro)
Os agradecería mucho que me echáseis una manos, porque no doy con la solución.
Gracias.
13
« en: Miércoles 10 de Noviembre de 2004, 12:26 »
Gracias por la ayuda Serghio!  Probaré a ver qué tal...
14
« en: Martes 9 de Noviembre de 2004, 18:08 »
Hola a todos,
A ver si podéis echarme una manita con este problema, por favor. Tengo una tabla de datos (los datos los presento en un datagrid). Son pares de puntos (X,Y). Quiero representarlos gráficamente. Tengo entendido que con PointF y otras herramientas de GDI podría hacerlo. Por el momento, tengo este código, pero no me funciona:
//Código para dibujar la curva de puntos // Creo el lápiz y el papel System.Drawing.Pen lapiz = new System.Drawing.Pen(Color.MediumOrchid); System.Drawing.Graphics papel = picGrafica.CreateGraphics();
//Array de puntos: inicializo el array metiendo un punto, pero no me gusta esto. PointF inicial = new PointF(0,0); PointF[] pts = {inicial}; foreach (DataRow dr in Andromeda.clases.comun.ds.Tables[Andromeda.clases.comun.TablaDatos].Rows) { // Si fila activa, q pinte el par (X,Y)=(Tensión,Corriente) bool valor = (bool)dr["Par activo"]; if(valor) { //Guardo cada punto (X,Y)=(V,I) en el array PointF pts double V = (double)dr["Tensión (V)"]; double I = (double)dr["Corriente (I)"]; // Convierto el tipo de los datos para poder guardarlos en pts float X = (float)V; float Y = (float)I; PointF punto = new PointF(X,Y);
// AQUI SALTA EXCEPCION: Conversion no válida!! Quiero guardar el punto en la matriz pts
pts[(int)dr["Identificador"]].Equals(punto);
}
// Bucle de prueba: dibujar curva uniendo puntos for(int i=1;i<pts.Length-1;i++) papel.DrawLine(lapiz,pts[(int)dr],pts[(int)dr[i+1]]); }
¿Alguien me podría decir cómo almacenar los Point que voy creando en la matriz PointF[] pts?
Otra pregunta: ¿es posible utilizar el MSChart para C#? En ese caso, ¿cómo hacerlo?
Mil gracias!
Páginas: [1]
|
|
|