Integrazione simbolica dei polinomi


21

Applicare un integrale indefinito a una determinata stringa. Le uniche regole che userete sono definite come tali:

∫cx ^ (n) dx = (c / (n + 1)) x ^ (n + 1) + C, n ≠ -1
c, C e n sono tutte costanti.

specifiche tecniche:

  • Devi essere in grado di integrare i polinomi con una delle possibili funzionalità:
    • Un coefficiente, forse una frazione nel formato (numerator/denominator).
    • Riconoscimento del fatto che e e π sono costanti e, nel loro uso, essere in grado di formare frazioni o espressioni che li contengono (possono essere mantenuti in una frazione come (e/denominator)o (numerator/e), o, se in esponente, x^(e+1))
      • A parte queste due costanti speciali, tutti i coefficienti saranno numeri razionali e reali.
    • Un esponente, forse una frazione, nel formato x^(exponent)
      • Le espressioni con eo πin esse, a parte se stesse, non saranno in esponente. (non dovrai integrare cose del genere x^(e+1), ma potresti integrare x^(e))
    • Può usare variabili non-x 1-char (es. f)
      • Questo è solo per gli intervalli ASCII 65-90 e 97-122.
    • Non è necessario utilizzare la regola della catena o integrare x^(-1).
  • L'output deve avere il riempimento (separazione tra i termini, ad es x^2 + x + C.
  • Se non si sa come integrarsi con le funzionalità di cui sopra, il programma dovrebbe essere stampato "Cannot integrate "+input.
  • Deve essere un programma completo.

bonus:

  • -10% se stampi gli esponenti "carini" formattati per il markdown (invece di x^2, x<sup>2</sup>).
  • -10% se si stampa l'equazione (cioè ∫xdx = (1/2)x^2 + C)

Esempi:

Ingresso:

x

Produzione:

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

Ingresso:

-f^(-2)

Produzione:

f^(-1) + C

Ingresso:

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

Produzione:

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

Ingresso:

πx^e

Produzione:

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

Ingresso:

(f+1)^(-1)

Produzione:

Cannot integrate (f+1)^(-1)

1
Sorpreso non abbiamo già questa domanda, ma non sono riuscito a trovare un duplicato. +1
Trauma digitale,

3
1. Presumo che a parte ee π, gli unici valori nei coefficienti saranno numeri razionali? Cioè non è necessario gestire polinomi multivariabili? 2. Quando dici " variabili non-x 1-char ", stai limitando a-zA-Zo intendi includere altri intervalli Unicode?
Peter Taylor,

1
Pensi che ci dovrebbe essere un bonus se il programma di qualcuno stampa ln(x) + Cper un input di x^(-1)?
Arcturus,

1
@Ampora No - che apre un'intera lattina di vermi che si occupano di coefficienti di ln.
Addison Crump,

1
@LeifWillerts 1) Volevo dire che x^(e+1)non sarà un integrando, ma potrebbe essere il risultato di un'integrazione. 2) Non ci saranno variabili con più lettere. 3) Sì 4) Sì, ma dovrebbe essere (1/56)x^(1/7+1) + C(ho fatto un errore negli esempi).
Addison Crump,

Risposte:


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

Questo crea una vera funzione φ che accetta una stringa come input. (Conta come programma completo per Mathematica?)

La versione non golfata sarebbe:

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

Nota che le lettere greche sono necessarie per poter usare tutte le altre lettere nell'input.


7

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

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

Questo è attualmente un work-in-progress che utilizza MATLAB integrati in capacità di integrazione simbolica. Attualmente i requisiti sono stati aggiornati, quindi il formato ora corrisponde ai requisiti. Si qualifica anche per il secondo bonus del 10%.

Se qualcuno vuole presentare e suggerire modi per correggere l'output o utilizzare questo codice come base per un'altra risposta, sentiti libero :). Se riesco a trovare il tempo, continuerò a giocarci e vedrò se riesco a pensare a come riformattare l'output.

Aggiornamento: Ok, quindi dopo un po 'più di lavoro, ecco come si trova attualmente il codice. È ancora in fase di elaborazione, ma ora si sta avvicinando alla corrispondenza dell'output richiesto.

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

Ecco alcuni esempi di ciò che attualmente produce. Come puoi vedere, non è del tutto corretto, ma si sta avvicinando.

ingressi:

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

Uscite:

∫(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)

Presumo che il problema con l'output che stai riscontrando sia che le frazioni non semplificano / vanno in un singolo coefficiente?
Addison Crump,

@FlagAsSpam, le frazioni si stanno semplificando, ma il problema è che finiscono dalla parte sbagliata della variabile. Ad esempio nel terzo esempio risulta x^(8/7)/8che mentre matematicamente corretto non è nella forma desiderata - (1/8)x^(8/7).
Tom Carpenter,

Considerando che finora sei l'unica risposta, potrei considerare di cambiare che se non ci saranno più risposte in un giorno o due in "qualsiasi risultato matematicamente corretto e valido" per le frazioni.
Addison Crump,

La tua risposta è valida: non è più necessario semplificare l'output frazionario. c:
Addison Crump,

Poi lo scriverò un po 'e conto i byte.
Tom Carpenter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.