• Sábado 20 de Abril de 2024, 12:19

Mostrar Mensajes

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
C# / Re: Código Unsafe
« 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):

Código: Text
  1. /***********************************************************************************
  2.    *          Método que implementa la función error: E       *
  3.    ***********************************************************************************/
  4.     public static double funcionE(int ident,double cte,double p1,double p2,double p3,double
  5.               p4,double p5,double p6)
  6.     {
  7.       double Iteor = 0;
  8.       double Err = 0;
  9.    
  10.       double T = Temperatura;
  11.       double Vexp;
  12.       double Iexp;
  13.  
  14.       for(int j=0; j<Mpuntos-N;j++)
  15.       {
  16.         Vexp = (double)puntosGrupo[ident][0,j];
  17.         Iexp = (double)puntosGrupo[ident][1,j];
  18.  
  19.        
  20.         // Calculo la Iteor
  21.         Iteor = Math.Abs(cte - ( p1*(Math.Exp((e*Vexp-p5*Iexp)/p3*k*T)-1) +
  22.               p2*(Math.Exp((e*Vexp-p5*Iexp)/p4*k*T)-1) + (Vexp-p5*Iexp)/p6 ));
  23.         // Calculo el error para ese punto concreto
  24.         Err = Math.Pow(((Iexp-Iteor)/Iexp),2);
  25.         // Lo sumo a la func. error global para el grupo tratado
  26.         funcE = funcE + Err;
  27.        
  28.  
  29.       }//endfor
  30.  
  31. return funcE;
  32.  
  33.     }//endmethod
  34.  


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
C# / Re: Código Unsafe
« 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 Amoeba


Y 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!!!!)
Código: Text
  1.  
  2. using System;
  3. using System.Data;
  4. using System.Data.OleDb;
  5. using System.ComponentModel;
  6. using System.Windows.Forms;
  7. using Andromeda.clases;
  8.  
  9.  
  10. namespace Andromeda.clases
  11. {
  12.   /// <summary>
  13.   /// Descripción breve de Amoeba.
  14.   /// </summary>
  15.  
  16.   public class Amoeba
  17.   {
  18.  
  19. /* Definiciones de Variables y Constantes*/    
  20.    
  21. public Amoeba(){}
  22.  
  23. /* Devuelve punto de evaluacion*/
  24. public static void Get_Msum(int n,double[] Msum)
  25. {
  26.   int ndim = n;  // Curva oscuridad, n = 6; mpts = 7
  27.   int mpts = ndim + 1;  
  28.   double sum;
  29.   int i;
  30.  
  31.   for(int j=0;j<=ndim-1;j++)  // Recorre las 6 columnas de M
  32.   {
  33.      for(sum = 0.0, i=0;i<=mpts-1;i++)  // Recorre las 7 filas de M
  34.     sum = sum + Andromeda.clases.comun.M[i,j];
  35.     Msum[j]=sum;    //Msum tiene 6 posiciones
  36.      }
  37.   }
  38.  
  39.  
  40. /* Intercambio de valores*/
  41. public static void SWAP(double a, double B)
  42. {
  43.   double aux = 0;
  44.   aux = a;
  45.   a = b;
  46.   b = aux;
  47. }
  48.  
  49.  
  50.  
  51. /* Función "Amotry"*/
  52. public static double amotry(int ident,double cte,double[,] M,double[] y,double Msum,int n,int ihi,int nfunk,double fac)
  53. {
  54.   int j;
  55.   double fac1; double fac2;
  56.   double ytry;
  57.   double[] ptry;
  58.  
  59.   int ndim = n;
  60.  
  61.   ptry = new double[ndim+1];
  62.   fac1 = (1.0-fac)/ndim;
  63.   fac2 = fac1-fac;
  64.  
  65.   for(j=0;j<=ndim-1;j++)
  66.       ptry[j]=Msum[j]*fac1-M[ihi,j]*fac2;
  67.  
  68.   ytry = Andromeda.clases.comun.funcionE(ident,cte,ptry); //Función a minimizar
  69.  
  70.   if(ytry < y[ihi])
  71.   {
  72.                    y[ihi]=ytry;
  73.      for(j=0;j<=ndim-1;j++)
  74.      {
  75.          Msum[j] = Msum[j] + ptry[j]-M[ihi,j];
  76.          M[ihi,j]= ptry[j];
  77.      }
  78.   }
  79.  
  80.   return ytry;
  81.   }//endmethod
  82.  
  83.  
  84. /*FUNCION "amoeba" */
  85. public static void amoeba(int ident,double cte,double[,] M,double[] y,int ndim,double ftol)
  86. {
  87.   // Zona de declaración de variables
  88.   int i,ihi,ilo,inhi,j,mpts;
  89.   double rtol,ysave,ytry; // sum?
  90.   int nfunk;
  91.      
  92.   // Zona de declaración de constantes
  93.   const int NMAX = 5000;
  94.   const int ITMAX = 100;
  95.   const double TINY = 1.0E-10;
  96.  
  97.   // Zona de inicialización de variables
  98.   double[] Msum = new double[ndim+1];
  99.   mpts = ndim +1;
  100.   nfunk = 0;
  101.  
  102.   Get_Msum(ndim,Msum);    
  103.  
  104.   for(;;)
  105.   {
  106.         ilo = 0;
  107.  
  108.      if(y[0]>y[1])
  109.      {
  110.          inhi = 1;
  111.          ihi = 0;
  112.       }
  113.      else
  114.      {
  115.          inhi = 0;
  116.          ihi = 1;
  117.      }
  118.  
  119.                    for(i=0; i<=mpts-1; i++)
  120.      {
  121.          if(y[i] <= y[ilo]) ilo = i;
  122.          if(y[i]>y[ihi])
  123.          {
  124.     inhi = ihi;
  125.     ihi = i;
  126.          }else if(y[i]>y[inhi] && i!=ihi) inhi = i;
  127.       }//endfor
  128.  
  129.   rtol = 2.0*Math.Abs(y[ihi]-y[ilo])/(Math.Abs(y[ihi])+Math.Abs(y[ilo])+TINY);
  130.  
  131.   if(rtol < ftol)
  132.   {
  133.             SWAP(y[0],y[ilo]);
  134.          for(i=0; i<=ndim-1; i++)
  135.     SWAP(M[0,i],M[ilo,i]);
  136.          break;
  137.                 }//endif
  138.  
  139.   if( nfunk >= NMAX)
  140.   {
  141.           // EN CASO DE ERROR:
  142.     return;
  143.                 }  
  144.  
  145.                 nfunk= nfunk+2;
  146.  
  147.   // Aquí comienza una nueva iteración
  148.   ytry = amotry(ident,cte,M,y,Msum,ndim,ihi,nfunk,-1.0);
  149.        
  150.   if(ytry <= y[ilo])
  151.   {
  152.            ytry = amotry(ident,cte,M,y,Msum,ndim,ihi,nfunk,2.0);
  153.   }
  154.   else if(ytry >= y[inhi])
  155.   {
  156.            ysave = y[ihi];
  157.            ytry = amotry(ident,cte,M,y,Msum,ndim,ihi,nfunk,0.5);
  158.  
  159.            if(ytry >= ysave)
  160.            {
  161.     for(i=0; i<=mpts-1; i++)
  162.     {
  163.           if(i!=ilo)
  164.          {
  165.               for(j=0; j<=ndim-1; j++)
  166.       M[i,j] = Msum[j]=0.5*(M[i,j]+M[ilo,j]);
  167.  
  168.                                            y[i] = Andromeda.clases.comun.funcionE(ident,cte,Msum);
  169.                                      }//endif
  170.     }//endfor
  171.  
  172.                  nfunk = nfunk + ndim;
  173.                  Get_Msum(ndim,Msum);
  174.                }//endif
  175.  
  176.   }//endif
  177.  
  178.   else --nfunk;
  179.  
  180.            }//endfor
  181.  
  182.      }
  183. }
  184.  

3
C# / Re: Código Unsafe
« 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
C# / Código Unsafe
« 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
Diseño de Algoritmos / Path O Cuadro De Diálogo
« 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
C# / Regex
« 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
C# / Re: Problema Serio: Factoriales
« 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) :blink:

¿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
C# / Problema Serio: Factoriales
« 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
Diseño de Algoritmos / Ayuda!!formar Grupos De Puntos Sin Repetición
« 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
C# / Re: Cómo Formar Grupos?
« 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
C# / Re: Cómo Formar Grupos?
« en: Jueves 2 de Diciembre de 2004, 19:36 »
Uauhh Serghio... las 5.12 am.. no me extraña que tengas sueño  :rolleyes:

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  :blink:

12
C# / Cómo Formar Grupos?
« 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
C# / Re: Pointf, Mschart
« en: Miércoles 10 de Noviembre de 2004, 12:26 »
Gracias por la ayuda Serghio!  :) Probaré a ver qué tal...

14
C# / Pointf, Mschart
« 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]