2 votos

Optimización de la compra de fichas de blockchain. Encontrar el valor máximo de una función.

Estoy trabajando en un contrato inteligente en ethereum blockchain. La idea es que usando una cantidad específica de dinero tengo que comprar el máximo número de tokens de dos contratos inteligentes diferentes. Esos dos contratos inteligentes calculan el número de tokens a vender usando dos funciones diferentes.

Contrato 1 - C-ORG de Fairmint.

$$F1(x) = \sqrt{\frac{2x}{b} + a^2} - a$$

donde b y a son valores constantes.

Contrato 2 - Contrato de arrastre de fichas Uniswap.

$$F2(x) = \frac{x*d*997}{g*1000 + x * 997}$$

donde d y g son constantes.

Lo que tengo que hacer es dividir mi cuenta de dinero que tengo entre esos dos contratos para que en total pueda obtener el máximo número de tokens posible de esos dos contratos combinados.

Así que mi entendimiento es que tengo que encontrar un valor máximo de la función $$F3(x) = F1(z) + F(x-z)$$ donde z es la cantidad de dinero gastada en el contrato 1 y $z <= x$ y $z>0$

Así que puedo decir que $$F3(x) = \sqrt{\frac{2z}{b} + a^2} - a + \frac{(x-z)*d*997}{g*1000 + (x-z) * 997} $$

Lo que necesito es encontrar el valor de z, conociendo el valor de x, para el cual esta función dará el máximo resultado.

No soy bueno en el cálculo así que usé Calculadora integral y me ha salido una ecuación como esta: $$\dfrac{1000dg\ln\left(\left|997\left(x-z\right)-1000g\right|\right)}{997}+\dfrac{\left(2x+a^2b\right)^\frac{3}{2}}{3\sqrt{b}}+dx-ax$$

Y ahora entiendo que tengo que encontrar el valor de z donde esta función será igual a cero. ¿No es así? $$\dfrac{1000dg\ln\left(\left|997\left(x-z\right)-1000g\right|\right)}{997}+\dfrac{\left(2x+a^2b\right)^\frac{3}{2}}{3\sqrt{b}}+dx-ax = 0$$

Tengo las siguientes preguntas:

  1. ¿Es mi pensamiento correcto? ¿Debo hacerlo así?
  2. ¿Es correcto el resultado del cálculo?
  3. ¿Cómo puedo estar seguro de que he encontrado el máximo y no el mínimo?
  4. Cómo puedo simplificar la última función para que sea más fácil de calcular. Estoy trabajando en un lenguaje de codificación ( solidity ) que sólo soporta funciones matemáticas básicas (add,sub,mul,div y operaciones binarias). No tengo nada para $\sqrt a$ o $\ln$

Cualquier ayuda será más que apreciada. Gracias.

0voto

John Omielan Puntos 431

Para determinar los máximos y/o mínimos de una función, debes tomar la derivada de la misma, no la integral. Como has dicho básicamente, tu función es

$$F3(z; x) = \sqrt{\frac{2z}{b} + a^2} - a + \frac{(x-z)*d*997}{g*1000 + (x-z) * 997} \tag{1}\label{eq1}$$

En este caso, $x$ es una cantidad determinada y $z$ es su variable. Por lo tanto, quieres tomar la derivada de \eqref {eq1} con respecto a $z$ . Al hacer esto se obtiene

$$\begin{equation}\begin{aligned} \frac{d\left(F3(z; x)\right)}{dz} & = \frac{1}{b\sqrt{\frac{2z}{b} + a^2}} - \frac{997d}{1000g + 997(x-z)} + \frac{997^2d(x - z)}{\left(1000g + 997(x-z)\right)^2} \\ & = \frac{1}{b\sqrt{\frac{2z}{b} + a^2}} + \frac{-997d\left(1000g + 997(x-z)\right) + 997^2d(x - z)}{\left(1000g + 997(x-z)\right)^2} \\ & = \frac{1}{b\sqrt{\frac{2z}{b} + a^2}} - \frac{997d(1000g)}{\left(1000g + 997(x-z)\right)^2} \end{aligned}\end{equation}\tag{2}\label{eq2}$$

Los valores máximos y mínimos se producirán en los puntos finales, es decir, donde $z = 0$ o $z = x$ o cuando la expresión en \eqref {eq2} es $0$ . En cuanto a la determinación de este último, se pueden igualar ambos términos entre sí, multiplicar en cruz, elevar al cuadrado y reunir los términos en $z$ juntos para obtener un polinomio cuártico. En particular, primero dejemos que $c = 997d(1000g)$ para simplificar el álgebra. Entonces se obtiene

$$\begin{equation}\begin{aligned} \frac{1}{b\sqrt{\frac{2z}{b} + a^2}} & = \frac{c}{\left(1000g + 997(x-z)\right)^2} \\ \left(1000g + 997(x-z)\right)^2 & = cb\sqrt{\frac{2z}{b} + a^2} \\ \left(1000g + 997(x-z)\right)^4 & = \left(cb\right)^2\left(\frac{2z}{b} + a^2\right) \end{aligned}\end{equation}\tag{3}\label{eq3}$$

Te dejo que hagas las multiplicaciones y la colección de términos si lo deseas. En cuanto a encontrar sus raíces, en realidad hay una solución analítica, como la que se describe en la Wikipedia Función cuártica artículo, pero es algo largo y desordenado. Como alternativa más fácil, hay muchos algoritmos de búsqueda de raíces, como los descritos en el artículo de Wikipedia Algoritmo de búsqueda de raíces artículo. No creo que necesites nada sofisticado, así que incluso en esos métodos numéricos básicos es probable que te funcione bien.

En cuanto a si tiene un máximo o un mínimo en algún momento, digamos $z_1$ normalmente se verificaría la segunda derivada en $z_1$ con un significado negativo $f$ es un máximo en $z_1$ y siendo el significado positivo $f$ es un mínimo en $z_1$ . En su caso, como no es probable que haya un problema de que estos puntos estén demasiado juntos, es posible que desee simplemente comprobar el $f$ valores en $z_1$ , un poco menos que $z_1$ y un poco más de $z_1$ para compararlos y determinar si es un máximo o un mínimo.

En cuanto al manejo de la expresión en un ordenador, aparentemente sólo existe la complicación de determinar la raíz cuadrada. Afortunadamente, existen algoritmos de determinación de la raíz cuadrada relativamente sencillos, pero bastante eficaces. Por ejemplo, el algoritmo de Wikipedia Métodos de cálculo de raíces cuadradas tiene algunas sugerencias excelentes, y es probable que incluso cualquiera de las más básicas que mencionan sea suficiente para tus necesidades.

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