Integração simbólica de polinômios

21

Aplique uma integral indefinida a uma determinada sequência. As únicas regras que você usará são definidas da seguinte maneira:

Matemática5 pontos
c, C e n são todas constantes.

Especificações:

  • Você deve poder integrar polinômios a qualquer um dos recursos possíveis:
    • Um coeficiente, possivelmente uma fração no formato (numerator/denominator).
    • Reconhecimento de que e e π são constantes e, em seu uso, podem formar frações ou expressões que as contenham (podem ser mantidas em uma fração como (e/denominator)ou (numerator/e), ou, se houver expoentes x^(e+1))
      • Além dessas duas constantes especiais, todos os coeficientes serão números reais racionais.
    • Um expoente, possivelmente uma fração, no formato x^(exponent)
      • Expressões com eou πneles, fora de si, não estarão em expoentes. (você não precisará integrar itens como x^(e+1), mas poderá integrar x^(e))
    • Pode usar variáveis ​​que não sejam x 1-char (ou seja f)
      • Isso é apenas para os intervalos ASCII 65-90 e 97-122.
    • Você não precisa usar regra de cadeia ou integrar x^(-1).
  • A saída deve ter preenchimento (separação entre termos, ie x^2 + x + C.
  • Se não se sabe como integrar com os recursos acima, o programa deve ser impresso "Cannot integrate "+input.
  • Deve ser um programa completo.

Bônus:

  • -10% se você imprimir os expoentes "bastante" formatado para remarcação (em vez de x^2, x<sup>2</sup>).
  • -10% se você imprimir a equação (ie ∫xdx = (1/2)x^2 + C)

Exemplos:

Entrada:

x

Saída:

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

Entrada:

-f^(-2)

Saída:

f^(-1) + C

Entrada:

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

Saída:

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

Entrada:

πx^e

Saída:

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

Entrada:

(f+1)^(-1)

Saída:

Cannot integrate (f+1)^(-1)
Addison Crump
fonte
11
Surpreso, ainda não temos essa pergunta - mas não consegui encontrar um dup. +1
Trauma digital
3
1. Presumo que, além de ee π, os únicos valores em coeficientes serão números racionais? Ou seja, não é necessário lidar com polinômios multivariáveis? 2. Ao dizer " variáveis ​​que não sejam x 1-char ", você está restringindo a-zA-Zou pretende incluir outros intervalos Unicode?
Peter Taylor
11
Você acha que deveria haver um bônus se o programa de alguém imprimir ln(x) + Cpara uma entrada de x^(-1)?
quer
11
@Ampora No - que abre uma lata inteira de worms que lidam com coeficientes de ln.
Addison Crump
11
@LeifWillerts 1) Eu quis dizer que x^(e+1)não será um integrando, mas pode ser o resultado de uma integração. 2) Não haverá várias variáveis ​​de letras. 3) sim 4) Sim, mas deveria ser (1/56)x^(1/7+1) + C(cometi um erro nos exemplos).
Addison Crump #

Respostas:

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

Isso cria uma verdadeira função takes que recebe uma String como Entrada. (Isso conta como um programa completo para o Mathematica?)

A versão não-gasta seria:

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

Observe que as letras gregas são necessárias para poder usar todas as outras letras na entrada.

senegrom
fonte
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

Atualmente, este é um trabalho em andamento usando MATLABs construídos em recursos de integração simbólica. Atualmente, os requisitos foram atualizados para que o formato agora corresponda aos requisitos. Também se qualifica para o segundo bônus de 10%.

Se alguém quiser sugerir maneiras de corrigir a saída ou usar esse código como base para outra resposta, fique à vontade :). Se eu encontrar o tempo, continuarei jogando com ele e ver se consigo pensar em como reformatar a saída.

Atualização: Ok, então, depois de um pouco mais de trabalho, eis como o código está atualmente. Ainda está em andamento, mas agora está mais perto de corresponder à saída necessária.

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

Aqui estão alguns exemplos do que atualmente produz. Como você pode ver, não está certo, mas se aproximando.

Entradas:

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

Saídas:

∫(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
fonte
Presumo que o problema com a saída que você está tendo é que as frações não simplificam / entram em um único coeficiente?
Addison Crump
@FlagAsSpam, as frações estão simplificando, mas o problema é que elas acabam no lado errado da variável. Por exemplo, no terceiro exemplo, resulta x^(8/7)/8que, enquanto matematicamente correto não está na forma que você deseja - (1/8)x^(8/7).
Tom Carpenter
Considerando que você é a única resposta até agora, eu poderia considerar alterar isso se não houver mais respostas em um dia ou dois para "qualquer saída válida e matematicamente correta" para frações.
Addison Crump
Sua resposta é válida - você não precisa mais simplificar a saída fracionária. c:
Addison Crump
Vou jogar um pouco e depois contar os bytes.
Tom Carpenter