2009-03-04 23 views
7

Tengo un pequeño problema matemático. Me gustaría tener una función con estas propiedades:¿Qué función matemática simple f (x) tiene estas propiedades?

  1. para x mucho más grandes que 0: lim f (x) = x
  2. para x mucho más pequeñas que 0: lim f (x) = 0
  3. y f (0) = 1 (lo siento, tuve aquí f (1) = 1, que estaba mal!)
  4. f (x) debe ser monotonically increasing

Así que la función debe parecerse esto:

 ^
     | /
     |/
     |/
    ___.-+´ 
--´-----+------> 
     | 

Lo mejor que tengo hasta ahora es x/(1 + e^(-x)) pero luego reconozco que cae por debajo de 0 y no aumenta monótonamente.

Una gran ayuda para jugar con esta función es GraphFunc Online.

Además, sería útil si la función es rápida de calcular ya que necesito ejecutarla muy a menudo.

EDIT: Estoy usando esto en un programa para limitar los valores. Tengo un algoritmo de optimización que usa ajuste de curvas con un algoritmo Levenberg-Marquardt. Pero este algoritmo no permite restricciones y optimiza en toda la gama de valores reales. Así que necesito una función como esta para poder agregar una restricción artificial para que la función sea mayor que 0. Un enfoque simple sería usar f(x) = x² pero luego la función no es monótonamente creciente y tiene dos minimas.

El Levenberg-Marquardt se aproxima a las derivadas, por lo que creo que sería mejor si la función es suave también. Pero no estoy seguro si esto es absolutamente necesario.

+0

No veo cómo esto está relacionado con la programación. –

+0

En este punto, esperaría ver algo más que una etiqueta de idioma. Explica por qué estás haciendo esto programáticamente o algo así. – EBGreen

+0

Pude ver fácilmente cómo esto está relacionado con la programación, pero quizás el OP podría agregar un contexto para satisfacer a los demás. –

Respuesta

5

Excepto por una discontinuty en 0, x/(1 - e^(-x)) funciona. Así que defina f (0) como 1, y usted está configurado.

#define E 2.71828183 
double SimpleFunc(double x) 
{ 
    if (x == 0) 
     return 1; 
    return x/(1 - pow(E, (-x))); 
} 

Probablemente más rápido:

double SimpleFunc2(double x) 
{ 
    if (x < 0) 
    return 1/(1 - x); 
    return x+1; 
} 

Ambos son continuas en la primera derivada, pero el segundo tiene un salto a la 1 de la segunda derivada)

Si realmente no quiere hacer la función a nivel de pieza, intente esto: (x^2+.1)^.5/((1 - e^(-x))^2+.1)^.5

+0

¡agradable! un poco más rápido sería x/(1 - e^(- x)) por supuesto, debido a no neg. –

+0

.. y en su variante "probablemente más rápida", en x> 0 devuelva x + 1 para disminuir la discontinuidad. –

+0

Sí, iba a sugerir x/(1 - e^(- x)) también, pero Iraimbilanja me ganó. :) – grieve

3

f (x) = abs (x/2) + x/2

donde abs (x) es el valor absoluto de x

Esta simple función obviamente sería rápida de calcular y cumple con los cuatro criterios.

+0

. Pidió que f (1) fuera 1, no f (0) (aunque su gráfica, sin escala, puede ser engañosa aquí). –

+0

Falta # 4: f (-10) = 10> 0 = f (0) –

0

No sé para qué lo está usando exactamente; ¿Qué pasa con una función por partes? Si vas a ser ejecutarlo mucho, algo como esto va a ser más rápido de lo que hacen los exponentes:

f(x) = -1/x, x < -1 
f(x) = 1, -1 <= x <= 1 
f(x) = x, x > 1 

EDIT: Fijo que lo que realmente funciona.

+0

indefinido en x = 0 y negativo cuando x <0 –

+0

@Patrick: D'oh! Gracias. – Pesto

+0

También para la mayoría de los propósitos, generalmente desea transiciones suaves de una a otra. –

1

Solo para darle ideas, esta es una solución sin la restricción f (1) = 1 y no aumenta monótonamente.

Básicamente, desea mezclar dos funciones: f1 (x) = 0 para x < 0 y f2 (x) = x para x> 0. Usted desea combinar eso sin problemas. Una función de paso simple con un límite constante en -inf y + inf es atan (los límites son -pi/2 y + pi/2 respectivamente).

Así que la combinación de una función de mezcla atan con f1 y f2, se obtiene:

mezcla (x) = atan (x)/PI + 0,5 f (x) = (1 - mezcla (x)) * f1 (x) + mezcla (x) * f2 (x)

Qué da:

f (x) = (atan (x)/PI + 0,5) * x

hay probablemente otras funciones de combinación que puede usar en lugar de atan. También tenga en cuenta que con valores negativos pequeños, f (x) será negativo.

Si quiere que su curva pase por (1,1), puede usar el hecho de que atan (0) = 0.

+0

DOH! ¡Me ganaste por 40 segundos! :) –

+0

En realidad, si la función tiene lim f (x) = x, y f (x) = x en x = 1, la función tiene que ser por partes. – Doub

0

1/2 * (x + ABS (x))

Es monotónica.

f (1) = 1.

Cuando x es menor que cero, f (x) = 0, de lo contrario es igual a x.

8

Aquí hay una smooth function que satisfaga sus requisitos:

f(x) = (x + sqrt(x^2 + 4))/2 

Para x = 0, se puede ver que f (x) = 1. Por muy grandes de x positivos, sqrt(x^2 + 4) es aproximadamente x, por lo que f (x) ≈ x. Por muy grandes x negativos, sqrt(x^2 + 4) es aproximadamente -x, por lo que f (x) ≈ 0.

La primera derivada es

f'(x) = 1/2 + 1/2*x/sqrt(x^2 + 4) 

Para x> 0, x/sqrt(x^2 + 4) > 0, por lo que f '(x)> 0 . para x < 0,

0 < x^2/(x^2 + 4) < 1 
0 < |x|/sqrt(x^2 + 4) < 1 
-1 < x/sqrt(x^2 + 4) < 0 
-1/2 < 1/2*x/sqrt(x^2 + 4) < 0 
1/2 + 1/2*x/sqrt(x^2 + 4) > 0 

por lo tanto, f '(x)> 0 para todo x, por lo que f (x) es creciente monótonamente a medida que se desee.

+0

Muchas gracias, yo también uso eso. Ojalá pudiera aceptar dos respuestas :) – martinus

Cuestiones relacionadas