多項式のシンボリック統合


21

与えられた文字列に不定積分を適用します。使用するルールは、次のように定義されます。

∫cx^(n)dx =(c /(n + 1))x ^(n + 1)+ C、n≠-1
c、C、およびnはすべて定数です。

仕様:

  • 多項式を可能な機能のいずれかと統合できる必要があります。
    • 係数、場合によっては形式の分数(numerator/denominator)
    • eおよびπが定数であり、それらを使用すると、分数またはそれらを含む式を形成できることを認識します((e/denominator)または(numerator/e)などの分数、または指数の場合はx^(e+1)
      • これら2つの特別な定数は別として、すべての係数は合理的な実数になります。
    • 形式の指数、場合によっては分数 x^(exponent)
      • それらを含むeまたはπその中の式は、それ自体は別として、指数ではありません。(のようなものを統合する必要はありませんが、統合x^(e+1)するかもしれませんx^(e)
    • x以外の1文字の変数を使用できます(つまりf
      • これは、ASCII範囲65〜90および97〜122のみです。
    • チェーンルールを使用したり、統合したりする必要はありませんx^(-1)
  • 出力にはパディング(用語間の分離、つまりx^2 + x + C
  • 上記の機能と統合する方法が不明な場合、プログラムは出力する必要があります"Cannot integrate "+input
  • 完全なプログラムでなければなりません。

ボーナス:

  • マークダウン用にフォーマットされた「きれいな」指数を印刷する場合は、-10%(代わりにx^2x<sup>2</sup>)。
  • 方程式を印刷する場合は-10%(つまり∫xdx = (1/2)x^2 + C

例:

入力:

x

出力:

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

入力:

-f^(-2)

出力:

f^(-1) + C

入力:

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

出力:

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

入力:

πx^e

出力:

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

入力:

(f+1)^(-1)

出力:

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

1
驚いたことに、この質問はまだありません。しかし、重複は見つかりませんでした。+1
デジタルトラウマ

3
1.私は他よりもあると推定eしてπ、係数の値のみが有理数になりますか?すなわち、多変数多項式を扱う必要はありませんか?2.「非x 1文字変数」と言うときa-zA-Z、他のUnicode範囲に制限するか、含めるつもりですか?
ピーターテイラー

1
誰かのプログラムln(x) + Cがの入力に対して印刷する場合、ボーナスがあるはずだと思いますx^(-1)か?
アークトゥルス

1
@Amporaいいえ-lnの係数を扱うワーム​​の缶全体を開きます。
アディソンクランプ

1
@LeifWillerts 1)私はそれx^(e+1)が被積分関数ではないことを意味しましたが、それは統合の結果かもしれません。2)複数の文字変数はありません。3)はい。4)はい。ただし、そうする必要があります(1/56)x^(1/7+1) + C(例に誤りがあります)。
アディソンクランプ

回答:


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

これにより、入力として1つの文字列を取る真​​の関数φが作成されます。(それはMathematicaの完全なプログラムとしてカウントされますか?)

改変されていないバージョンは次のようになります。

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

入力で他のすべての文字を使用するには、ギリシャ文字が必要であることに注意してください。


7

MATLAB、646 x 0.9 = 581.4バイト

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

これは現在、シンボリック統合機能に組み込まれたMATLABを使用した進行中の作業です。現在、要件が更新されているため、形式は要件に一致しています。また、2番目の-10%ボーナスの資格もあります。

出力を修正する方法を提案して提案したい場合、またはこのコードを別の答えの基礎として使用したい場合は、お気軽に:)。時間を見つけることができたら、それをいじり続け、出力を再フォーマットする方法を考えられるかどうかを確認します。

更新: OK これはまだ進行中の作業ですが、必要な出力との一致に近づいています。

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

以下は、現在生成されているものの例です。ご覧のとおり、それは正しくありませんが、近づいています。

入力:

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

出力:

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

あなたが持っている出力の問題は、分数が単純化されない/単一の係数にならないことだと思いますか?
アディソンクランプ

@FlagAsSpam、分数は単純化されていますが、問題は変数の間違った側になってしまうことです。たとえば、3番目の例でx^(8/7)/8は、数学的には正しいものの、目的の形式ではありません(1/8)x^(8/7)
トムカーペンター

これまでのところあなたが唯一の答えであると考えると、1日か2日以内にそれ以上答えが出ない場合は、分数の「数学的に正しい有効な出力」に変更することを検討できます。
アディソンクランプ

あなたの答えは有効です-あなたはもう分数の出力を単純化する必要はありません。c:
アディソンクランプ

それから少しゴルフをして、バイトを数えます。
トムカーペンター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.