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)

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.


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)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.