Intégration symbolique des polynômes

21

Appliquez une intégrale indéfinie à une chaîne donnée. Les seules règles que vous utiliserez sont définies comme telles:

∫cx ^ (n) dx = (c / (n + 1)) x ^ (n + 1) + C, n ≠ -1
c, C et n sont tous des constantes.

Caractéristiques:

  • Vous devez être en mesure d'intégrer des polynômes avec l'une des fonctionnalités possibles:
    • Un coefficient, éventuellement une fraction dans le format (numerator/denominator).
    • Reconnaître que e et π sont des constantes, et dans leur utilisation, être capable de former des fractions ou des expressions les contenant (peut être maintenu dans une fraction comme (e/denominator)ou (numerator/e), ou, si dans les exposants, x^(e+1))
      • En dehors de ces deux constantes spéciales, tous les coefficients seront des nombres réels rationnels.
    • Un exposant, éventuellement une fraction, au format x^(exponent)
      • Les expressions avec eou πen elles, à part elles-mêmes, ne seront pas dans les exposants. (vous n'aurez pas à intégrer des trucs comme x^(e+1), mais vous pourriez intégrer x^(e))
    • Peut utiliser des variables non x 1 caractère (c.-à-d. f)
      • C'est uniquement pour les plages ASCII 65-90 et 97-122.
    • Vous n'avez pas besoin d'utiliser de règle de chaîne ou d'intégrer x^(-1).
  • La sortie doit avoir un remplissage (séparation entre les termes, c.-à-d x^2 + x + C.
  • Si vous ne savez pas comment intégrer les fonctionnalités ci-dessus, le programme devrait s'imprimer "Cannot integrate "+input.
  • Ce doit être un programme complet.

Bonus:

  • -10% si vous imprimez les "jolis" exposants formatés pour le démarque (au lieu de x^2, x<sup>2</sup>).
  • -10% si vous imprimez l'équation (ie ∫xdx = (1/2)x^2 + C)

Exemples:

Contribution:

x

Sortie:

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

Contribution:

-f^(-2)

Sortie:

f^(-1) + C

Contribution:

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

Sortie:

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

Contribution:

πx^e

Sortie:

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

Contribution:

(f+1)^(-1)

Sortie:

Cannot integrate (f+1)^(-1)
Addison Crump
la source
1
Surpris, nous n'avons pas déjà cette question - mais je n'ai pas trouvé de dup. +1
Digital Trauma
3
1. Je présume qu'à part eet π, les seules valeurs des coefficients seront des nombres rationnels? C'est à dire qu'il n'est pas nécessaire de gérer des polynômes multivariables? 2. Lorsque vous dites " variables non x 1 caractère ", limitez-vous a-zA-Zou prévoyez-vous d'inclure d'autres plages Unicode?
Peter Taylor
1
Pensez-vous qu'il devrait y avoir un bonus si le programme de quelqu'un imprime ln(x) + Cpour une entrée de x^(-1)?
Arcturus
1
@Ampora No - qui ouvre toute une boîte de vers traitant des coefficients de ln.
Addison Crump
1
@LeifWillerts 1) Je voulais dire que x^(e+1)ce ne sera pas un intégrant, mais cela peut être le résultat d'une intégration. 2) Il n'y aura pas de variables à plusieurs lettres. 3) Oui. 4) Oui, mais ça devrait l'être (1/56)x^(1/7+1) + C(j'ai fait une erreur dans les exemples).
Addison Crump

Réponses:

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",σ]])&

Cela crée une véritable fonction φ qui prend une chaîne en entrée. (Est-ce que cela compte comme un programme complet pour Mathematica?)

La version non golfée serait:

φ=(
    σ="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",
            σ
        ]
    ]
)&

Notez que les lettres grecques sont nécessaires pour pouvoir utiliser toutes les autres lettres dans l'entrée.

senegrom
la source
7

MATLAB, 646 x 0,9 = 581,4 octets

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

Il s'agit actuellement d'un travail en cours utilisant des MATLABs dotés de capacités d'intégration symbolique. Actuellement, les exigences ont été mises à jour de sorte que le format correspond désormais aux exigences. Il se qualifie également pour le deuxième bonus de -10%.

Si quelqu'un veut intervenir et suggérer des moyens de corriger la sortie, ou utiliser ce code comme base pour une autre réponse, n'hésitez pas :). Si je peux trouver le temps, je vais continuer à jouer avec et voir si je peux penser à reformater la sortie.

Mise à jour: Ok, donc après un peu plus de travail, voici comment le code se présente actuellement. Il s'agit toujours d'un travail en cours, mais qui se rapproche désormais de la sortie requise.

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

Voici quelques exemples de ce qu'il produit actuellement. Comme vous pouvez le voir, ce n'est pas tout à fait vrai, mais cela se rapproche.

Contributions:

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

Les sorties:

∫(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
la source
Je suppose que le problème avec la sortie que vous rencontrez est que les fractions ne simplifient pas / n'entrent pas dans un seul coefficient?
Addison Crump
@FlagAsSpam, les fractions se simplifient, mais le problème est qu'elles se retrouvent du mauvais côté de la variable. Par exemple, dans le troisième exemple, il en résulte x^(8/7)/8que, bien que mathématiquement correct, il ne se présente pas sous la forme souhaitée (1/8)x^(8/7).
Tom Carpenter
Étant donné que vous êtes la seule réponse à ce jour, je pourrais envisager de changer que si aucune autre réponse ne parvient dans un jour ou deux à "n'importe quelle sortie mathématiquement correcte et valide" pour les fractions.
Addison Crump
Votre réponse est valable - Vous n'avez plus à simplifier la sortie fractionnée. c:
Addison Crump
Je vais le jouer un peu plus bas et compter les octets.
Tom Carpenter