Polinomların Sembolik Bütünleşmesi


21

Belirli bir dizgiye belirsiz bir integral uygulayın. Kullanacağınız tek kural şöyle tanımlanır:

∫cx ^ (n) dx = (c / (n + 1)) x ^ (n + 1) + C, n ≠ -1
c, C ve n'nin tümü sabittir.

Özellikler:

  • Polinomları olası özelliklerden herhangi biriyle entegre edebilmeniz gerekir:
    • Bir katsayı, muhtemelen biçimdeki bir kesir (numerator/denominator).
    • E ve constant'nın sabit olduğunu ve kullanımlarında, onları içeren kesirler veya ifadeler oluşturabildiğini kabul etmek ( (e/denominator)ya da (numerator/e), ya da üstel ise, bir kesirde tutulabilir x^(e+1))
      • Bu iki özel sabitin yanı sıra, tüm katsayılar rasyonel, gerçek sayılar olacaktır.
    • Bir üs, biçiminde muhtemelen bir kesir x^(exponent)
      • İçinde eveya πiçlerinde bulunan ifadeler , kendi başlarına, üstler halinde olmayacaktır. (gibi şeyleri bütünleştirmeniz gerekmeyecek x^(e+1), ancak bütünleşebilirsiniz x^(e))
    • X-char olmayan değişkenleri kullanabilir (ör. f)
      • Bu sadece ASCII 65-90 ve 97-122 aralıkları içindir.
    • Zincir kuralı kullanmanız veya entegre etmeniz gerekmez x^(-1).
  • Çıktının bir dolgusu olmalıdır (terimler arasında ayrım, yani x^2 + x + C.
  • Yukarıdaki özelliklerle nasıl bütünleştirileceği bilinmiyorsa, program yazdırılmalıdır "Cannot integrate "+input.
  • Tam bir program olmalı.

Bonuslar:

  • % -10 etiketleme için biçimlendirilmiş "güzel" üstleri yazdırırsanız (yerine x^2, x<sup>2</sup>).
  • -10% denklemi yazdırırsanız (yani ∫xdx = (1/2)x^2 + C)

Örnekler:

Giriş:

x

Çıktı:

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

Giriş:

-f^(-2)

Çıktı:

f^(-1) + C

Giriş:

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

Çıktı:

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

Giriş:

πx^e

Çıktı:

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

Giriş:

(f+1)^(-1)

Çıktı:

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

1
Bu soruyu zaten almadığımıza şaşırdım - ama bir dup bulamadım. +1
Dijital Travma

3
1. Ben diğerinden daha farz eve π, katsayılar sadece değerler rasyonel sayılar olacak? Yani, çok değişkenli polinomları idare etmek gerekli değil mi? 2. " x 1-char olmayan değişkenler " a-zA-Zderken, diğer Unicode aralıklarını dahil etmeyi mi düşünüyorsunuz?
Peter Taylor

1
Birisinin programı ln(x) + Cbir giriş için yazdırırsa , bir bonus olması gerektiğini düşünüyor musunuz x^(-1)?
Arcturus

1
@Ampora Hayır - bu, ln katsayılarıyla ilgili bir sürü solucan kutusunu açar.
Addison Crump,

1
@LeifWillerts 1) Bunun x^(e+1)bir integral olmayacağını kastetmiştim , fakat bir entegrasyonun sonucu olabilir. 2) Birden fazla harf değişkeni olmayacak. 3) Evet. 4) Evet, ama öyle olmalı (1/56)x^(1/7+1) + C(örneklerde hata yaptım).
Addison Crump,

Yanıtlar:


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

Bu, bir String'i Girdi olarak alan gerçek bir işlev yaratır. (Bu Mathematica için eksiksiz bir program olarak sayılıyor mu?)

Ungolfed versiyonu olacaktır:

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

Girişteki tüm diğer harfleri kullanabilmek için Yunanca harflerin gerekli olduğunu unutmayın.


7

MATLAB, 646 x 0.9 = 581.4 bayt

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

Bu, şu anda sembolik bütünleşme yeteneklerinde yerleşik olan MATLAB'ları kullanan bir çalışmadır. Şu anda gereksinimler güncellenmiştir, bu nedenle biçim artık gereksinimlerle eşleşir. Aynı zamanda ikinci% -10 bonus için geçerli.

Herhangi biri çıktı almak ve düzeltmek için önerilerde bulunmak veya bu kodu başka bir yanıt için temel olarak kullanmak isterse, çekinmeyin :). Zamanı bulabilirsem, onunla oynamaya devam edeceğim ve çıktının nasıl yeniden biçimlendirileceğini düşünebilecek miyim diye bakacağım.

Güncelleme: Tamam, biraz daha fazla işten sonra, kod şu anda nasıl durduğunu İşte. Halen devam etmekte olan bir çalışmadır, ancak şimdi istenen çıktıyı eşleştirmeye yaklaşıyoruz.

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

İşte şu anda ürettiği şeylerin bazı örnekleri. Gördüğünüz gibi, doğru değil, daha da yakınlaşıyor.

girişler:

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

Çıktılar:

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

Çıktılarınızla ilgili problemin, kesirlerin tek bir katsayıya basitleştirme / girmemesi olduğunu farz ediyorum?
Addison Crump,

@FlagAsSpam, kesirler basitleştiricidir, ancak sorun değişkenlerin yanlış tarafında kalmalarıdır. Örneğin, üçüncü örnekte x^(8/7)/8, matematiksel olarak doğru olsa da istediğiniz biçimde olmadığı sonucuna varır - (1/8)x^(8/7).
Tom Carpenter,

Şu ana kadar tek cevap siz olduğunuzu düşününce, bir veya iki günde bir cevap gelmezse kesirler için "herhangi bir matematiksel olarak doğru, geçerli çıktı" olarak değiştirmeyi düşünebilirim.
Addison Crump

Cevabınız geçerlidir - Artık kesirli çıktıyı basitleştirmek zorunda değilsiniz. c:
Addison Crump

Sonra biraz golf oynayacağım ve baytları sayacağım.
Tom Carpenter,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.