Integración simbólica de polinomios

21

Aplicar una integral indefinida a una cadena dada. Las únicas reglas que usará se definen como tales:

∫cx ^ (n) dx = (c / (n + 1)) x ^ (n + 1) + C, n ≠ -1
c, C yn son todas constantes.

Presupuesto:

  • Debe poder integrar polinomios con cualquiera de las características posibles:
    • Un coeficiente, posiblemente una fracción en el formato (numerator/denominator).
    • Reconocer que e y π son constantes y, en su uso, ser capaces de formar fracciones o expresiones que las contengan (se pueden mantener en una fracción como (e/denominator)o (numerator/e), o, en exponentes, x^(e+1))
      • Aparte de estas dos constantes especiales, todos los coeficientes serán números racionales, reales.
    • Un exponente, posiblemente una fracción, en el formato x^(exponent)
      • Las expresiones con eo πen ellas, aparte de sí mismas, no estarán en exponentes. (no tendrá que integrar cosas como x^(e+1), pero podría integrar x^(e))
    • Puede usar variables que no sean x 1-char (es decir f)
      • Esto es solo para los rangos ASCII 65-90 y 97-122.
    • No tiene que usar la regla de cadena o integrarse x^(-1).
  • La salida debe tener relleno (separación entre términos, es decir x^2 + x + C.
  • Si no se sabe cómo integrarse con las características anteriores, el programa debería imprimirse "Cannot integrate "+input.
  • Debe ser un programa completo.

Bonificaciones:

  • -10% si se imprime a cabo los exponentes "bastante" formateado de rebaja (en lugar de x^2, x<sup>2</sup>).
  • -10% si imprime la ecuación (es decir ∫xdx = (1/2)x^2 + C)

Ejemplos:

Entrada:

x

Salida:

(1/2)x^(2) + C

Entrada:

-f^(-2)

Salida:

f^(-1) + C

Entrada:

(1/7)x^(1/7) + 5

Salida:

(1/56)x^(8/7) + 5x + C

Entrada:

πx^e

Salida:

(π/(e+1))x^(e+1) + C

Entrada:

(f+1)^(-1)

Salida:

Cannot integrate (f+1)^(-1)
Addison Crump
fuente
1
Sorprendido, ya no tenemos esta pregunta, pero no pude encontrar un duplicado. +1
Trauma digital
3
1. Supongo que, aparte de ey π, ¿los únicos valores en coeficientes serán números racionales? Es decir, no es necesario manejar polinomios multivariables? 2. Cuando dice " variables que no son x 1-char ", ¿está restringiendo a-zA-Zo tiene la intención de incluir otros rangos Unicode?
Peter Taylor
1
¿Crees que debería haber una bonificación si el programa de alguien imprime ln(x) + Cpara una entrada de x^(-1)?
Arcturus
1
@Ampora No: eso abre una lata entera de gusanos que se ocupan de los coeficientes de ln.
Addison Crump
1
@LeifWillerts 1) Quise decir que x^(e+1)no será un integrando, pero puede ser el resultado de una integración. 2) No habrá múltiples variables de letras. 3) sí. 4) Sí, pero debería serlo (1/56)x^(1/7+1) + C(cometí un error en los ejemplos).
Addison Crump

Respuestas:

2

Mathematica 478 * 0.9 = 430.2

φ=(α=ToExpression;Π=StringReplace;σ="Cannot integrate "<>#1;Λ=DeleteDuplicates@StringCases[#1,RegularExpression["[a-df-zA-Z]+"]];μ=Length@Λ;If[μ>1,σ,If[μ<1,Λ="x",Λ=Λ[[1]]];Ψ=α@Π[#1,{"e"->" E ","π"->" π "}];Φ=α@Λ;Θ=α@Π[#1,{"e"->" 2 ","π"->" 2 "}];λ=Exponent[Θ,Φ,List];Θ=Simplify[Θ*Φ^Max@@Abs@λ];Θ=PowerExpand[Θ/.Φ->Φ^LCM@@Denominator@λ];If[Coefficient[Ψ,Φ,-1]==0&&PolynomialQ[Θ,Φ],"∫("<>#1<>")d"<>Λ<>" = "<>Π[ToString[Integrate[Ψ,Φ],InputForm],{"E"->"e","Pi"->"π"}]<>" + C",σ]])&

Esto crea una verdadera función φ que toma una Cadena como Entrada. (¿Eso cuenta como un programa completo para Mathematica?)

La versión sin golf sería:

φ=(
    σ="Cannot integrate "<>#1;
    Λ=DeleteDuplicates@StringCases[#1,RegularExpression["[a-df-zA-Z]+"]];
    If[Length@Λ>1,σ,
        If[Length@Λ<1,Λ="x",Λ=Λ[[1]]];
        Ψ=ToExpression@StringReplace[#1,{"e"->" E ","π"->" π "}];
        Φ=ToExpression@Λ;
        Θ=ToExpression@StringReplace[#1,{"e"->" 2 ","π"->" 2 "}];
        λ=Exponent[Θ,Φ,List];
        Θ=Simplify[Θ*Φ^Max@@Abs@λ];
        Θ=PowerExpand[Θ/.Φ->Φ^LCM@@Denominator@λ];
        If[Coefficient[Ψ,Φ,-1]==0&&PolynomialQ[Θ,Φ],
            "∫("<>#1<>")d"<>Λ<>" = "<>StringReplace[ToString[Integrate[Ψ,Φ],InputForm],{"E"->"e","Pi"->"π"}]<>" + C",
            σ
        ]
    ]
)&

Tenga en cuenta que las letras griegas son necesarias para poder utilizar todas las otras letras en la entrada.

senegrom
fuente
7

MATLAB, 646 x 0.9 = 581.4 bytes

t=input('','s');p=char(960);s=regexprep(t,{p,'pi([a-zA-Z])','([a-zA-Z])pi','([\)e\d])([a-zA-Z])','([a-zA-Z])(([\(\d]|pi))','e^(\(.+?\))','e'},{'pi','pi*$1','$1*pi','$1*$2','$1*$2','exp($1)','exp(1)'});r=[s(regexp(s,'\<[a-zA-Z]\>')),'x'];r=r(1);e=0;try
I=int(sym(strsplit(s,' + ')),r);S=[];for i=I
S=[S char(i) ' + '];end
b=0;o=[];for i=1:nnz(S)
c=S(i);b=b+(c==40)-(c==41);if(c==42&&S(i+1)==r)||(b&&c==32)
c='';end
o=[o c];end
o=regexprep(char([8747 40 t ')d' r ' = ' o 67]),{'pi','exp\(1\)','exp','\^([^\(])',['1/' r]},{p,'e','e^','^($1)',[r '^(-1)']});catch
e=1;end
if e||~isempty(strfind(o,'log'))
disp(['Cannot integrate ' t]);else
disp(o);end

Actualmente, este es un trabajo en progreso que usa MATLABs integradas en capacidades de integración simbólica. Actualmente, los requisitos se han actualizado, por lo que el formato ahora coincide con los requisitos. También califica para el segundo bono de -10%.

Si alguien quiere participar y sugerir formas de corregir la salida, o usar este código como base para otra respuesta, no dude :). Si puedo encontrar el tiempo, seguiré jugando con él y veré si puedo pensar cómo formatear la salida.

Actualización: Ok, así que después de un poco más de trabajo, así es como se encuentra actualmente el código. Todavía es un trabajo en progreso, pero ahora se está acercando a la salida requerida.

t=input('','s'); %Get input as a string
p=char(960); %Pi character
s=regexprep(t,{p,'pi([a-zA-Z])','([a-zA-Z])pi','([\)e\d])([a-zA-Z])','([a-zA-Z])(([\(\d]|pi))','e^(\(.+?\))','e'},{'pi','pi*$1','$1*pi','$1*$2','$1*$2','exp($1)','exp(1)'}); %Reformat input to work with built in symbolic integration
r=[s(regexp(s,'\<[a-zA-Z]\>')),'x'];r=r(1); %determine the variable we are integrating
e=0; %Assume success
try
    I=int(sym(strsplit(s,' + ')),r); %Integrate each term seperately to avoid unwanted simplificaiton
    S=[];
    for i=I
        S=[S char(i) ' + ']; %Recombine integrated terms
    end
    %Now postprocess the output to try and match the requirements
    b=0;o=[];
    for i=1:nnz(S)
        %Work through the integrated string character by character
        c=S(i);
        b=b+(c=='(')-(c==')'); %Keep track of how many layers deep of brackets we are in
        if(c=='*'&&S(i+1)==r)||(b&&c==' ') %If a '*' sign preceeds a variable. Also deblank string.
            c=''; %Delete this character
        end
        o=[o c]; %merge into new output string.
    end
    o=regexprep([char(8747) '(' t ')d' r ' = ' o 'C'],{'pi','exp\(1\)','exp','\^([^\(])',['1/' r]},{p,'e','e^','^($1)',[r '^(-1)']});
catch
    e=1; %failed to integrate
end
if e||~isempty(strfind(o,'log'))
    disp(['Cannot integrate ' t])  %bit of a hack - matlab can integrate 1/x, so if we get a log, we pretend it didn't work.
else
    disp(o)% Display it.
end

Aquí hay algunos ejemplos de lo que produce actualmente. Como puede ver, no está del todo bien, pero se está acercando.

Entradas:

x
-f^(-2)
(1/7)x^(1/7) + 5
πx^e
(f+1)^(-1)

Salidas:

∫(x)dx = x^(2)/2 + C
∫(-f^(-2))df = f^(-1) + C
∫((1/7)x^(1/7) + 5)dx = x^(8/7)/8 + 5x + C
∫(πx^(e))dx = (πx^(e+1))/(e+1) + C
Cannot integrate (f+1)^(-1)
Tom Carpenter
fuente
Supongo que el problema con el resultado que está teniendo es que las fracciones no se simplifican / entran en un solo coeficiente.
Addison Crump
@FlagAsSpam, las fracciones se están simplificando, pero el problema es que terminan en el lado equivocado de la variable. Por ejemplo, en el tercer ejemplo, resulta x^(8/7)/8que, si bien matemáticamente correcto, no está en la forma que lo desea - (1/8)x^(8/7).
Tom Carpenter
Teniendo en cuenta que usted es la única respuesta hasta ahora, podría considerar cambiar eso si no llegan más respuestas en un día o dos a "cualquier salida matemáticamente correcta y válida" para fracciones.
Addison Crump
Su respuesta es válida: ya no tiene que simplificar la salida fraccional. do:
Addison Crump
Lo jugaré un poco y luego contaré los bytes.
Tom Carpenter