Symbolische Integration von Polynomen

21

Wenden Sie ein unbestimmtes Integral auf eine bestimmte Zeichenfolge an. Die einzigen Regeln, die Sie verwenden, sind als solche definiert:

Cx ^ (n) dx = (c / (n + 1)) x ^ (n + 1) + C, n ≤ –1
c, C und n sind alle Konstanten.

Spezifikationen:

  • Sie müssen in der Lage sein, Polynome mit einer der möglichen Funktionen zu integrieren:
    • Ein Koeffizient, möglicherweise ein Bruch im Format (numerator/denominator).
    • Erkennen, dass e und π Konstanten sind und in ihrer Verwendung Brüche oder Ausdrücke bilden können, die sie enthalten (kann in einem Bruch wie (e/denominator)oder (numerator/e)oder, falls in Exponenten, enthalten sein x^(e+1))
      • Abgesehen von diesen beiden speziellen Konstanten sind alle Koeffizienten rationale reelle Zahlen.
    • Ein Exponent, möglicherweise ein Bruch, im Format x^(exponent)
      • Ausdrücke mit eoder πin ihnen, abgesehen von sich selbst, werden nicht in Exponenten sein. (Sie müssen keine Dinge wie integrieren x^(e+1), aber Sie könnten integrieren x^(e))
    • Kann nicht-x 1-Zeichen-Variablen verwenden (dh f)
      • Dies gilt nur für die ASCII-Bereiche 65-90 und 97-122.
    • Sie müssen keine Kettenregel verwenden oder integrieren x^(-1).
  • Die Ausgabe muss mit einer Auffüllung versehen sein (Trennung zwischen Begriffen, d x^2 + x + C. H.
  • Wenn nicht bekannt ist, wie die oben genannten Funktionen integriert werden sollen, sollte das Programm ausgedruckt werden "Cannot integrate "+input.
  • Es muss ein volles Programm sein.

Boni:

  • -10%, wenn Sie die "hübschen" Exponenten ausdrucken, die für Abschriften formatiert sind (anstelle von x^2, x<sup>2</sup>).
  • -10%, wenn Sie die Gleichung ausdrucken (dh ∫xdx = (1/2)x^2 + C)

Beispiele:

Eingang:

x

Ausgabe:

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

Eingang:

-f^(-2)

Ausgabe:

f^(-1) + C

Eingang:

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

Ausgabe:

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

Eingang:

πx^e

Ausgabe:

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

Eingang:

(f+1)^(-1)

Ausgabe:

Cannot integrate (f+1)^(-1)
Addison Crump
quelle
1
Überrascht haben wir diese Frage noch nicht - aber ich konnte keinen Dup finden. +1
Digitales Trauma
3
1. Ich gehe davon aus, dass außer eund πdie einzigen Werte in Koeffizienten rationale Zahlen sind. Dh es ist nicht notwendig, multivariable Polynome zu behandeln? 2. Wenn Sie " non-x 1-char variables " sagen , beschränken Sie sich darauf a-zA-Zoder beabsichtigen Sie, andere Unicode-Bereiche einzuschließen ?
Peter Taylor
1
Denken Sie, dass es einen Bonus geben sollte, wenn jemandes Programm ln(x) + Cfür eine Eingabe von druckt x^(-1)?
Arcturus
1
@Ampora Nein - das eröffnet eine ganze Dose Würmer, die sich mit In-Koeffizienten befassen.
Addison Crump
1
@LeifWillerts 1) Ich meinte, das x^(e+1)wird kein Integrand, aber es kann das Ergebnis einer Integration sein. 2) Es gibt keine Variablen mit mehreren Buchstaben. 3) Ja. 4) Ja, aber es sollte sein (1/56)x^(1/7+1) + C(ich habe einen Fehler in den Beispielen gemacht).
Addison Crump

Antworten:

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

Dies erzeugt eine wahre Funktion φ, die einen String als Eingabe annimmt. (Zählt das als vollständiges Programm für Mathematica?)

Die ungolfed Version wäre:

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

Beachten Sie, dass die griechischen Buchstaben erforderlich sind, um alle anderen Buchstaben in der Eingabe verwenden zu können.

Senegrom
quelle
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

Dies ist derzeit noch in Arbeit, da MATLABs mit symbolischen Integrationsfunktionen ausgestattet sind. Derzeit wurden die Anforderungen aktualisiert, sodass das Format jetzt den Anforderungen entspricht. Es qualifiziert sich auch für den zweiten -10% Bonus.

Wenn jemand Vorschläge zur Korrektur der Ausgabe machen oder diesen Code als Grundlage für eine andere Antwort verwenden möchte, zögern Sie nicht :). Wenn ich die Zeit finde, spiele ich weiter damit und überlege, wie ich die Ausgabe neu formatieren kann.

Update: Ok, also nach ein bisschen mehr Arbeit ist hier, wie der Code derzeit steht. Es ist noch in Arbeit, aber jetzt näher an der gewünschten Ausgabe.

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

Hier sind einige Beispiele dessen, was derzeit produziert wird. Wie Sie sehen, ist es nicht ganz richtig, aber immer näher.

Eingänge:

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

Ausgänge:

∫(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
quelle
Ich gehe davon aus, dass das Problem bei der Ausgabe darin besteht, dass die Brüche nicht zu einem einzigen Koeffizienten zusammengefasst werden.
Addison Crump
@FlagAsSpam, die Brüche vereinfachen sich, aber das Problem ist, dass sie auf der falschen Seite der Variablen landen. Zum Beispiel ergibt sich im dritten Beispiel, dass x^(8/7)/8die mathematisch korrekte Form nicht so ist, wie Sie es möchten - (1/8)x^(8/7).
Tom Carpenter
In Anbetracht dessen, dass Sie die einzige Antwort sind, könnte ich in Erwägung ziehen, diese zu ändern, wenn innerhalb von ein oder zwei Tagen keine weiteren Antworten mehr auf "mathematisch korrekte, gültige Ausgaben" für Brüche eingehen.
Addison Crump
Ihre Antwort ist gültig - Sie müssen die Teilausgabe nicht mehr vereinfachen. c:
Addison Crump
Ich werde dann ein bisschen Golf spielen und die Bytes zählen.
Tom Carpenter