Integrasi Simbolis dari Polinomial

21

Terapkan integral tak terbatas ke string yang diberikan. Satu-satunya aturan yang akan Anda gunakan adalah seperti itu:

∫cx ^ (n) dx = (c / (n + 1)) x ^ (n + 1) + C, n ≠ -1
c, C, dan n adalah konstanta.

Spesifikasi:

  • Anda harus dapat mengintegrasikan polinomial dengan salah satu fitur yang mungkin:
    • Koefisien, mungkin sebagian kecil dalam format (numerator/denominator).
    • Pengakuan bahwa e dan π adalah konstanta, dan dalam penggunaannya, dapat membentuk fraksi atau ekspresi yang mengandungnya (dapat disimpan dalam fraksi seperti (e/denominator)atau (numerator/e), atau, jika dalam eksponen, x^(e+1))
      • Selain dari dua konstanta khusus ini, semua koefisien akan menjadi bilangan real, rasional.
    • Eksponen, mungkin sebagian kecil, dalam format x^(exponent)
      • Ekspresi dengan eatau πdi dalamnya, selain dari diri mereka sendiri, tidak akan berada dalam eksponen. (Anda tidak harus mengintegrasikan hal-hal seperti x^(e+1), tetapi Anda mungkin mengintegrasikan x^(e))
    • Dapat menggunakan variabel non-x 1-char (yaitu f)
      • Ini hanya untuk ASCII berkisar 65-90 dan 97-122.
    • Anda tidak harus menggunakan aturan rantai atau mengintegrasikan x^(-1).
  • Output harus memiliki bantalan (pemisahan antara istilah, yaitu x^2 + x + C.
  • Jika tidak diketahui cara mengintegrasikan dengan fitur-fitur di atas, program harus mencetak "Cannot integrate "+input.
  • Itu harus program penuh.

Bonus:

  • -10% jika Anda mencetak eksponen "cantik" yang diformat untuk penurunan harga (bukan x^2, x<sup>2</sup>).
  • -10% jika Anda mencetak persamaan (yaitu ∫xdx = (1/2)x^2 + C)

Contoh:

Memasukkan:

x

Keluaran:

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

Memasukkan:

-f^(-2)

Keluaran:

f^(-1) + C

Memasukkan:

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

Keluaran:

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

Memasukkan:

πx^e

Keluaran:

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

Memasukkan:

(f+1)^(-1)

Keluaran:

Cannot integrate (f+1)^(-1)
Addison Crump
sumber
1
Terkejut kami belum memiliki pertanyaan ini - tetapi saya tidak dapat menemukan dup. +1
Trauma Digital
3
1. Saya menduga bahwa selain edan π, satu-satunya nilai dalam koefisien adalah bilangan rasional? Yaitu tidak perlu menangani polinomial multivariabel? 2. Ketika Anda mengatakan " variabel non-x 1-char ", apakah Anda membatasi a-zA-Zatau apakah Anda bermaksud menyertakan rentang Unicode lainnya?
Peter Taylor
1
Apakah Anda pikir harus ada bonus jika program seseorang mencetak ln(x) + Cuntuk masukan x^(-1)?
Arcturus
1
@Ampora Tidak - yang membuka seluruh kaleng cacing berurusan dengan koefisien ln.
Addison Crump
1
@LeifWillerts 1) Maksud saya x^(e+1)tidak akan menjadi integand, tetapi mungkin merupakan hasil dari integrasi. 2) Tidak akan ada banyak variabel huruf. 3) Ya. 4) Ya, tetapi seharusnya (1/56)x^(1/7+1) + C(saya membuat kesalahan dalam contoh).
Addison Crump

Jawaban:

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

Ini menciptakan fungsi sebenarnya φ yang mengambil satu String sebagai Input. (Apakah itu termasuk program yang lengkap untuk Mathematica?)

Versi ungolfed adalah:

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

Perhatikan bahwa huruf-huruf Yunani diperlukan untuk dapat menggunakan semua huruf lain dalam input.

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

Saat ini sedang dalam proses menggunakan MATLAB yang dibangun dalam kemampuan integrasi simbolis. Saat ini persyaratan telah diperbarui sehingga format sekarang sesuai dengan persyaratan. Itu juga memenuhi syarat untuk bonus -10% kedua.

Jika ada yang ingin mencoba dan menyarankan cara-cara mengoreksi output, atau menggunakan kode ini sebagai dasar untuk jawaban lain, jangan ragu :). Jika saya dapat menemukan waktu, saya akan terus bermain dengannya dan melihat apakah saya bisa memikirkan cara memformat ulang output.

Pembaruan: Oke, jadi setelah bekerja sedikit lagi, berikut adalah bagaimana kode saat ini berdiri. Ini masih dalam proses, tetapi sekarang semakin dekat dengan mencocokkan output yang dibutuhkan.

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

Berikut adalah beberapa contoh dari apa yang saat ini dihasilkannya. Seperti yang Anda lihat, itu tidak benar, tetapi semakin dekat.

Input:

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

Output:

∫(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
sumber
Saya berasumsi masalah dengan output yang Anda miliki adalah bahwa fraksi tidak menyederhanakan / masuk ke koefisien tunggal?
Addison Crump
@ FlagAsSpam, pecahan menyederhanakan, tetapi masalahnya adalah mereka berakhir di sisi yang salah dari variabel. Misalnya dalam contoh ketiga ini menghasilkan di x^(8/7)/8mana sementara secara matematis benar tidak dalam bentuk yang Anda inginkan - (1/8)x^(8/7).
Tom Carpenter
Menimbang bahwa Anda adalah satu-satunya jawaban sejauh ini, saya mungkin mempertimbangkan untuk mengubah bahwa jika tidak ada lagi jawaban yang muncul dalam satu atau dua hari untuk "setiap hasil yang benar secara matematis, valid" untuk fraksi.
Addison Crump
Jawaban Anda valid - Anda tidak perlu menyederhanakan hasil fraksional lagi. c:
Addison Crump
Saya akan golf sedikit kemudian dan menghitung byte.
Tom Carpenter