1 votos

¿Existe una posible solución matemática para esto?

Tengo lo que podría considerarse una pregunta impar. Quiero ver si puedo encontrar una fórmula/ecuación que me ayude con lo siguiente.

Estoy trabajando en un paquete de software que estamos utilizando para calcular las tasas. El problema es que hay muchas limitaciones en lo que la aplicación puede hacer, como pocas o ninguna función, límites de caracteres, etc.

Necesito calcular una tarifa prorrateada en función de los metros cuadrados y del mes.

Ejemplos:

250 pies cuadrados en octubre son 50

3200 pies cuadrados en abril son 62,50

Los valores base provienen de una tabla, así:

        0-499   500-999 1000-1999  2000-2999 3000-3999
10      50.00   60.00   75.00      100.00    125.00 
11      45.83   55.00   68.75      91.67     114.58 
12      41.67   50.00   62.50      83.33     104.17 
1       37.50   45.00   56.25      75.00     93.75  
2       33.33   40.00   50.00      66.67     83.33  
3       29.17   35.00   43.75      58.33     72.92  
4       25.00   30.00   37.50      50.00     62.50  
5       20.83   25.00   31.25      41.67     52.08  
6       16.67   20.00   25.00      33.33     41.67  
7       12.50   15.00   18.75      25.00     31.25  
8       8.33    10.00   12.50      16.67     20.83  
9       4.17    5.00    6.25       8.33      10.42  

Tengo una bonita sentencia If anidada que funciona bien, sin embargo, utilizar la tabla completa (los valores llegan hasta los 60.000+ pies cuadrados) supera ampliamente el límite de 3k caracteres...

Aquí hay un recorte de esa declaración If:

If($[60RETAIL]MONTH$ = 1,
If(AND($[60RETAIL]SQFT$ > 0, $[60RETAIL]SQFT$ <= 499), 41.67 - 50, 
(If(AND($[60RETAIL]SQFT$ > 499, $[60RETAIL]SQFT$ <= 999), 50 - 60,
(If(AND($[60RETAIL]SQFT$ > 999, $[60RETAIL]SQFT$ <= 1999), 62.5 - 75,
(If(AND($[60RETAIL]SQFT$ > 1999, $[60RETAIL]SQFT$ <= 2999), 83.33 - 100,
(If(AND($[60RETAIL]SQFT$ > 2999, $[60RETAIL]SQFT$ <= 3999), 104.17 - 125,
(If(AND($[60RETAIL]SQFT$ > 3999, $[60RETAIL]SQFT$ <= 4999), 125 - 150,
(If(AND($[60RETAIL]SQFT$ > 4999, $[60RETAIL]SQFT$ <= 5999), 166.67 - 200,
(If(AND($[60RETAIL]SQFT$ > 5999, $[60RETAIL]SQFT$ <= 6999), 208.33 - 250,
(If(AND($[60RETAIL]SQFT$ > 6999, $[60RETAIL]SQFT$ <= 7999), 250 - 300,
(If(AND($[60RETAIL]SQFT$ > 7999, $[60RETAIL]SQFT$ <= 8999), 291.67 - 350,
(If(AND($[60RETAIL]SQFT$ > 8999, $[60RETAIL]SQFT$ <= 9999), 333.33 - 400,
(If(AND($[60RETAIL]SQFT$ > 9999, $[60RETAIL]SQFT$ <= 10999), 416.67 - 500,
(If(AND($[60RETAIL]SQFT$ > 10999, $[60RETAIL]SQFT$ <= 19999), 500 - 600,
(If(AND($[60RETAIL]SQFT$ > 19999, $[60RETAIL]SQFT$ <= 29999), 583.33 - 700,
(If(AND($[60RETAIL]SQFT$ > 29999, $[60RETAIL]SQFT$ <= 39999), 666.67 - 800,
(If(AND($[60RETAIL]SQFT$ > 39999, $[60RETAIL]SQFT$ <= 49999), 750 - 900,
(If(AND($[60RETAIL]SQFT$ > 49999, $[60RETAIL]SQFT$ <= 59999), 833.33 - 1000,
(If($[60RETAIL]SQFT$ > 59999, 917.67 - 1100,
1))))))))))))))))))))))))))))))))))),

Multiplica eso por 12 y puedes ver lo grande que se pone.. Estoy esperando una ecuación que pueda usar que reduzca mis matemáticas a una solución más pequeña..

¿Es posible?

Gracias.

EDITAR: He metido esto en la sección de Matemáticas ya que buscaba una solución matemática ya que el programa que estoy utilizando tiene muy poca capacidad de programación. Parece que está en espera por estar en la sección equivocada? ¡Si a alguien se le ocurre una zona mejor lo pondré allí con mucho gusto! Mi primer post :)

¡Gracias!

EDIT2: Creo que las limitaciones del software ganan esta vez incluso después de acortarlo un poco con algunas de las grandes sugerencias aquí, todavía no será lo suficientemente corto para encajar en las limitaciones de caracteres.

Dicho esto, tengo un plan B que involucra triggers SQL / Procedimientos almacenados que funcionará, sólo estaba tratando de evitar el uso de la parte de atrás. Sin embargo, las ideas que has proporcionado me ayudarán mucho, ya que las fórmulas acortarán mi código en el back-end.

¡Gracias a todos!

1voto

mvw Puntos 13437

Esa parte de los datos parece ser lineal a trozos:

enter image description here

La línea azul ( $f$ ) y la línea roja ( $f_2$ ) son: $$ f(x) = 50 + (45.83-50)(x-10) \\ f_2(x) = 8.33 + (4.17-8.33)(x-8) $$

Si su lenguaje de programación permite definir funciones, entonces puede evitar puede evitar la repetición en su código moviendo estas declaraciones

If(AND($[60RETAIL]SQFT$ > 499, $[60RETAIL]SQFT$ <= 999), 50 - 60

en una función con los datos cambiantes como parámetros. La lectura de los parámetros para la $k$ -ésima declaración de la misma matriz de variables $p1[k]$ , $p2[k]$ etc. dentro de un bucle reducirá aún más su código.

Si sus datos resultan ser todos lineales a trozos, puedes reemplazar los datos del array con datos generados a partir de la función lineal a trozos llamada para algunos parámetros del índice.

0voto

Hagen von Eitzen Puntos 171160

Esto parece coincidir con

int A[] = {6000,7500,10000,12500};
int tmp = (sqft<500)? 5000 : A[sqft/1000];
int q = month<10? 10-month : 22-month;
return ((tmp * q +11)/22) * 0.01;

0voto

grand_chat Puntos 4103

En cada columna de la tabla, los elementos obedecen a una relación rectilínea con el número de fila: El elemento de la fila 2 es $\frac{11}{12}$ del elemento de la fila 1, el elemento de la fila 3 es $\frac{10}{12}$ del elemento de la fila 1, y así sucesivamente. En general, el elemento de la fila $k$ es $\frac{13-k}{12}$ veces el elemento de la fila $1$ .

Puedes acortar tu código aprovechando esta relación: para reproducir la tabla sólo necesitas conocer la fila superior. Pero debe tener cuidado de asignar el mes al número de fila apropiado. (Si la tabla siempre comienza en octubre, entonces podría asignar octubre a k=1 , de noviembre a k=2 , de diciembre a k=3 etc., y luego aplicar su fórmula para obtener fee[k] .)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X