¿Cómo puedes escribir en C una función que devuelve el punto fijo de una función?

La combinación perezosa del combinador de punto fijo = λ f . f ( arreglo f ) no funciona en un lenguaje estrictamente evaluado como C. Pero esto no implica que todos los combinadores de punto fijo sean una ilusión de evaluación perezosa. Si se sabe que f acepta y devuelve una función , entonces podemos expandir eta el combinador de punto fijo perezoso en la combinación estricta del combinador de punto fijo = λ f . λ x . f ( arreglo f ) x , y este funciona bien en C:

#include  #include  /* Closure abstraction */ struct closure { void *(*fn)(void *data, void *arg); void *data; }; struct closure *close(void *(*fn)(void *data, void *arg), void *data) { struct closure *f = malloc(sizeof(struct closure)); f->fn = fn; f->data = data; return f; } void *call(struct closure *f, void *arg) { return f->fn(f->data, arg); } /* Fixed-point combinator */ struct closure *fix(struct closure *f); static void *fix_fn(void *f, void *arg) { return call(call(f, fix(f)), arg); } struct closure *fix(struct closure *f) { return close(&fix_fn, f); } /* Factorial test. */ static void *fact1_fn(void *f, void *arg) { int *n = arg; int *ret = malloc(sizeof(int)); if (*n == 0) { *ret = 1; } else { int n1 = *n - 1; int *m = call(f, &n1); *ret = *n * *m; } return ret; } static void *fact_fn(void *data, void *f) { return close(fact1_fn, f); } int main(void) { struct closure *f = close(&fact_fn, NULL); int n = 5; int *ret; ret = call(fix(f), &n); printf("%d\n", *ret); /* prints 120 */ ret = call(call(f, fix(f)), &n); printf("%d\n", *ret); /* prints 120 */ return 0; } 

Estoy de acuerdo con la respuesta de Brian Bi a ¿Cómo puedes escribir en C una función que devuelve el punto fijo de una función? Una función es mucho más general que la respuesta del usuario de Quora. ¿Cómo puede escribir en C una función que devuelva el punto fijo de una función? a la hora de escribir asume. Una función puede devolver conjuntos, por ejemplo. En tales casos, la “tasa de cambio” (o pendiente, o derivada) no tiene mucho significado. Para funciones que devuelven un número, sí, uno probablemente puede hacer lo que hace Aparijata. Formas similares pueden ser válidas para algunas funciones específicas. Un caso especial es una función con puntos fijos atractivos .

La comparación de Brian con las ecuaciones de diofantina es bastante adecuada: una vez puede resolver ciertas ecuaciones de diofantina con bastante facilidad a través de la programación, pero no ninguna ecuación arbitraria. En general, no se puede escribir una función en C, ni tampoco una función en ningún lenguaje, para obtener el punto fijo de una función arbitraria.

Esto depende de si está dispuesto a conformarse con la precisión y el rango de entradas o flotadores de 32 bits. Si es así, generalmente es práctico simplemente iterar a través de todas las posibilidades 2 ^ 32 y verificar cuándo la salida coincide con la entrada (dentro de una tolerancia apropiada, en el caso flotante). De lo contrario, debe saber más sobre g (por ejemplo, ¿cumple las condiciones para la convergencia del método de Newton?) Antes de poder hacerlo de manera eficiente y correcta.

No puedes Tampoco puedes hacerlo en ningún otro idioma. Hay algunos lenguajes en los que puede definir combinadores de punto fijo, pero en general no devuelven valores explícitos; es simplemente la forma en que ocurre la evaluación en el lenguaje lo que permite que la definición tenga sentido. Calcular explícitamente un valor fijo de una función arbitraria es al menos tan difícil como, por ejemplo, resolver una ecuación arbitraria de diofantina (que sabemos que es imposible).

Una pequeña búsqueda en Google me llevó a esta Iteración de punto fijo … Se puede encontrar una descripción de las matemáticas Iteración de punto fijo, pero supongo que ya sabes que 🙂

Si eres demasiado vago para abrir el enlace, aquí está el programa, copiado y pegado del enlace

  doble función (doble x) // esta es la función para la que desea encontrar el punto fijo
     {
         retorno (1 + x - pow (x, 2) / 4);
     }

     vacío principal()
 {
         doble MaxPnew = 1E + 200;  / * valor absoluto más alto para Pnew * /
         doble Tol = 0.000001;  / * Criterio de terminación * /
         int Max = 200;  / * Número máximo de iteraciones * /
         doble pequeño = 0.000001;  / * Inicializa la variable * /
         int K = 0;  / * Inicializar el contador * /
         doble RelErr = 1;  / * Inicializa la variable * /
         doble Pterm;  / * ENTRADA: La aproximación inicial * /
         doble Pnew;  / * Resultado de una iteración * /
         doble pliegue, Dg, Delta, Dx, pendiente;
         int iwarn = 0;  / * Inicializar bandera de advertencia * /

         printf ("Ingrese el valor de INICIO para la iteración: \ n");
         scanf ("% lf", & Pterm);
         printf ("valor de INICIO para la iteración: Pterm =% lf \ n", Pterm);
         printf ("");

         Pnew = gfunction (Pterm);  / * Primera iteración * /

     while ((RelErr> = Tol) && (K <= Max)) {

          K ++;  / * Incrementar el contador * /
          Pliegue = Pterm;  / * Anterior iterar p_ (k + 1) * /
          Pterm = Pnew;  / * Actual iterate p_k * /
          Pnew = gfunction (Pterm);  / * Calcular nueva iteración p_ (k + 1) * /

        if (fabs (Pnew)> MaxPnew) {/ * Verifique +/- INF antes
                                             el final del ciclo while * /
             iwarn = 1;  / * establecer indicador para advertencia * /
             descanso;  / * salir del ciclo while * /
        }

          Dg = Pnew - Pterm;  / * Diferencia en la función g * /
          Delta = fabs (Dg);  /* Error absoluto */
          RelErr = 2 * Delta / (fabs (Pnew) + Small);  /* Error relativo */

     } / * Fin del ciclo 'while' * /

         Dx = Pterm - Pliegue;  / * Diferencia en x * /
         Pendiente = Dg / Dx;  / * g '(p_k) * /

     printf ("----------------------------------------------- \norte");

     if (iwarn) {/ * Dile que Pnew ha crecido dramáticamente y detén * /
          printf ("Número de iteraciones:% d \ n", K);
          printf ("¡La iteración sale del rango de precisión! \ n");
          printf ("Valor de x = Pnew =% G \ n", Pnew);
          printf ("¡La secuencia parece ser divergente! \ n");
          salida (0);
     }

     printf ("Número de iteraciones:% d \ n", K);
     printf ("El punto fijo calculado de g (x) es% lf \ n", Pnew);
     printf ("Las iteraciones consecutivas están dentro de% lf \ n", Delta);

    if (fabs (Slope)> 1) printf ("La secuencia parece ser divergente. \ n");
    else printf ("La secuencia parece converger. \ n");

 } / * Finalizar programa principal * 

Si puede saber que la función es continua y tiene un diferencial completamente positivo, probablemente podría usar el método de Newton.

More Interesting

No puedo encontrar el máximo / mínimo de este problema del multiplicador de Lagrange sin obtener un número complejo cerca del final. ¿Qué estoy haciendo mal?

¿Qué es el error numérico?

¿Qué piensan los informáticos teóricos de la hipótesis del universo matemático de Max Tegmark?

¿Cómo valora las opciones sobre acciones utilizando la transformación de Fourier?

¿Qué debo saber sobre las matemáticas combinadas con el desarrollo web (programación)?

¿Es importante entender cómo se derivan los teoremas específicos, o es suficiente entender solo cómo usarlos?

Cómo escribir un programa en C para imprimir todas las permutaciones posibles de un número dado

¿Cuáles son las áreas más activas de investigación en matemática computacional?

¿Cómo podemos demostrar que una curva de Bezier es un caso específico de una curva B-spline por la definición de B-splines?

¿Qué tan importante es que un lenguaje de programación sea Turing completo?

¿Cuál es la interpretación de XOR de los enteros? ¿Hay alguna forma simple de calcular XOR en lugar de 'XOR-ing' todos los bits individuales?

¿Resolver acertijos me hará mejor en matemáticas, física, informática o resolución general de problemas?

¿Cuál es el estado actual de la computación analógica?

¿Cuál es su problema (s) abierto (s) favorito (s) en Machine Learning desde la perspectiva teórica de un científico de la computación?

¿Cuál es la diferencia entre Basic Auth, Digest Auth, oAuth1.0 y oAuth2.0? ¿Cuál es un ejemplo de cada uno en el núcleo de PHP?