Encontrar un derivado de una función almacenada en una matriz de caracteres

Lo que necesito hacer es leer un archivo que contiene ecuaciones. Necesito tomar la derivada de cada ecuación y luego escribir esas ecuaciones derivadas en un archivo .txt diferente. He leído todas las ecuaciones en una matriz de matrices de caracteres y ahora no sé qué hacer una vez que las haya almacenado en la matriz. Realmente no necesito ayuda para escribir las ecuaciones en otro archivo; Sé que puedo resolver eso.

Lo que necesito ayuda es encontrar una forma de obtener el derivado de las funciones. El tipo de ecuaciones que se van a leer no es tan complicado; serán polinomios que no necesitan la regla de la cadena o la regla del cociente. Sin embargo, habrá sin x , cos x y tan x . Algunas ecuaciones de ejemplo que se leerían son.

-2x^2+2x-3 -2x+sinx-3 -x+sin2x-tanx 

Las funciones trigonométricas no tendrán paréntesis y la variable siempre será “x”. Solo necesito un empujón en la dirección correcta, por favor.

Lo que realmente estás pidiendo es un analizador . Un analizador es básicamente un conjunto de reglas para leer esas ecuaciones y cambiar / leer (analizar) cada una de ellas. Intentaré recorrer cada línea del archivo y diferenciarlo teniendo en cuenta que tiene un conjunto de caracteres específico (es decir, ^ significa potencia, x es el parámetro, etc.);

Por ejemplo, algún pseudo código:

 Open the file. While there's lines to read: Read a line - Seperate it by the operands (+,-,/,*) For each part: Find the power of x, Reduce it by one, ...(derivating rules) // no way around, you have to implement each function if you want this to work as others mentioned in the comments. Reconnect the parts into a string, Add it to a list. Print each element of the list. 

Si necesita ayuda para traducir eso a C, solo pídalo; Felizmente te ayudaré

Lo que debe hacer, por el aspecto de las cosas, es separar la expresión en términos individuales para que pueda encontrar la derivada de cada uno a su vez.

Puede definir un término como la secuencia más grande de caracteres que no contienen separadores de términos como (en sus ejemplos) + y - .

Por lo tanto, los términos para sus ejemplos son:

 -2x^2+2x-3 => 2x^2 2x 3 -2x+sinx-3 => 2x sinx 3 -x+sin2x-tanx => x sin2x tanx 

Para cada término, debe evaluar la forma del término. La forma dictará cómo se crea el derivado.


Por ejemplo, puede detectar si contiene una función trigonométrica de la forma [n]sin[m]x donde n y m son números opcionales. Para simplificar las cosas, puede agregar esos términos si no están allí, como sinx convierte en 1sin1x (llamaré a esto la forma completa del término). Ser capaz de asumir que todos los subterms están presentes facilitará enormemente el cálculo de la derivada.

Digamos que el término es sin4x . Ampliación que le dará 1sin4x que luego puede dividir en multiplicador de término 1 , función sin y multiplicador 4 x 4 . Luego, utilizando el conocimiento derivado estándar nsinmx => (n*m)cosmx , esto se convertiría en 4cos(4x) y ese término se haría.


Si no contiene una función trigonométrica, puede usar el mismo truco de forma completa para cubrir todas las expresiones de potencia / constante con las siguientes reglas:

  • si es una constante (todo numérico), agregue x^0 (multiplique por 1).
  • si termina con x , agrega ^1 , entonces 4x convierte en 4x^1 .
  • si comienza con x , prefije con 1 , entonces x^3 convierte en 1x^3 .

Una vez hecho esto, tendrá una forma completa de ax^b y luego podrá crear la derivada (ab)x^(b-1) y procesarla posteriormente:

  • si el bit después de x es ^0 , elimine todo x^0 .
  • si el bit después de x es ^1 , elimine ^1 .
  • si el bit anterior a la x es 1 , elimínelo.
  • si el bit anterior a la x es 0 , elimine el término completo (y el separador de término precedente, si corresponde).

Por lo tanto, teniendo una combinación compleja de sus datos de prueba:

 -2x^2 + 5x + 4sin3x - 3 

que puede ser tratado como:

 0 - 2x^2 + 5x + 4sin3x - 3 

Las siguientes acciones suceden a cada término:

 0 [0x^1] (derives as) 0, remove it. 2x^2 [2x^2] (derives as) (2*2)x^(2-1) => 4x^1 => 4x 5x [5x^1] (derives as) (5x1)x^(1-1) => 5x^0 => 5 4sin3x [4sin3x] (derives as) 12cos3x 3 [3x^0] (derives as) 0, remove it and preceding '-' 

Así terminas con - 4x + 5 + 12cos3x que, aunque mi educación de cálculo es de unos treinta años en el pasado (y no creo que lo haya usado desde entonces, aunque sin duda lo usaré el próximo año cuando mi El mayor de los éxitos de la escuela secundaria), Wolfram Alpha parece estar de acuerdo conmigo 🙂

Esta función analizará el texto, lo cortará en diferentes partes identificadas por el type[i] y las almacenará en una estructura. Reconoce x , +, – y números. Se puede ampliar para incluir otros operadores, etc.

 #define maxlen 50 #define idx 0 //X variable #define idnumber 1 //number #define idplus 2 //+ sign #define idminus 3 //- sign struct foo { int type[10];//each type can be a number (idnum), +, -, etc. int num[10];//if type[i] is number then num[i] identifies that number int count;//total number of parts }; void parse_one_line(struct foo *v, const char *s) { char buf[maxlen]; memset(buf, 0, maxlen); int j = 0; //remove white spaces for (int i = 0, len = strlen(s); i < len; i++) { if (s[i] == ' ') continue; buf[j] = s[i]; j++; } char part[maxlen]; v->count = 0; for (int i = 0, len = strlen(buf); i < len; i++) { char c = buf[i]; if (c == 'x') { v->type[v->count] = idx; v->count++; } else if (c == '+') { v->type[v->count] = idplus; v->count++; } else if (c == '-') { v->type[v->count] = idminus; v->count++; } else if (c >= '0' && c <= '9') { int j = 0; memset(part, 0, maxlen); for (; i < len; i++) { c = buf[i]; if (c >= '0' && c <= '9') { part[j] = c; j++; } else { break; } } i--; v->num[v->count] = atoi(part); v->type[v->count] = idnumber; v->count++; } } for (int i = 0; i < v->count; i++) { switch (v->type[i]) { case idnumber: printf("%d", v->num[i]); break; case idx: printf("X"); break; case idplus: printf("+"); break; case idminus: printf("-"); break; default:break; } } printf("\n"); } int main() { struct foo st; parse_one_line(&st, "-23x + 2 + 2x - 3"); return 0; } 
    Intereting Posts