การบูรณาการเชิงสัญลักษณ์ของพหุนาม


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))
      • นอกเหนือจากค่าคงที่สองค่าคงที่สัมประสิทธิ์ทั้งหมดจะเป็นจำนวนตรรกยะจำนวนจริง
    • เลขชี้กำลังอาจเป็นเศษส่วนในรูปแบบ x^(exponent)
      • การแสดงออกกับeหรือπในพวกเขานอกเหนือจากตัวเองจะไม่อยู่ในเลขยกกำลัง (คุณจะไม่ต้องรวมสิ่งต่าง ๆ เช่นx^(e+1)แต่คุณอาจรวมx^(e))
    • สามารถใช้ตัวแปรที่ไม่ใช่ x 1-char (เช่นf)
      • สิ่งนี้มีไว้สำหรับช่วง ASCII 65-90 และ 97-122 เท่านั้น
    • คุณไม่จำเป็นต้องใช้กฎลูกโซ่หรือรวมเข้าx^(-1)ด้วยกัน
  • การส่งออกจะต้องมีช่องว่างภายใน x^2 + x + C(แยกระหว่างคำเช่น
  • "Cannot integrate "+inputถ้ามันไม่เป็นที่รู้จักวิธีการที่จะบูรณาการที่มีคุณสมบัติดังกล่าวข้างต้นโปรแกรมจะพิมพ์ออกมา
  • มันจะต้องเป็นโปรแกรมเต็มรูปแบบ

โบนัส:

  • -10% ถ้าคุณพิมพ์เลขชี้กำลัง "สวย" ที่จัดรูปแบบสำหรับ markdown (แทนx^2, x<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-char " คุณ จำกัดa-zA-Zหรือตั้งใจที่จะรวมช่วง Unicode อื่นหรือไม่?
Peter Taylor

1
คุณคิดว่าควรจะมีโบนัสถ้าของใครบางคนพิมพ์โปรแกรมln(x) + Cสำหรับการป้อนข้อมูลของx^(-1)?
Arcturus

1
@Ampora No - ที่เปิดขึ้นทั้งหมดของหนอนสามารถจัดการกับค่าสัมประสิทธิ์ของ ln
Addison Crump

1
@LeifWillerts 1) ฉันหมายถึงว่าx^(e+1)จะไม่รวมเข้าด้วยกัน แต่อาจเป็นผลมาจากการรวมเข้าด้วยกัน 2) จะไม่มีตัวแปรตัวอักษรหลายตัว 3) ใช่ 4) ใช่ แต่มันควรจะเป็น(1/56)x^(1/7+1) + C(ฉันทำผิดพลาดในตัวอย่าง)
Addison Crump

คำตอบ:


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

สิ่งนี้จะสร้างฟังก์ชั่นจริง takes ที่รับหนึ่งสตริงเป็นอินพุต (นับเป็นโปรแกรมที่สมบูรณ์สำหรับ 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 ที่สร้างขึ้นในความสามารถในการรวมสัญลักษณ์ ปัจจุบันมีการปรับปรุงข้อกำหนดเพื่อให้รูปแบบตรงกับข้อกำหนดในขณะนี้ นอกจากนี้ยังมีสิทธิ์ได้รับโบนัส -10% ที่สอง

หากใครต้องการที่จะเลือกและแนะนำวิธีการแก้ไขผลลัพธ์หรือใช้รหัสนี้เป็นพื้นฐานสำหรับคำตอบอื่นอย่าลังเล :) หากฉันสามารถหาเวลาได้ฉันจะเล่นกับมันต่อไปและดูว่าฉันสามารถคิดวิธีการจัดรูปแบบผลลัพธ์ใหม่ได้หรือไม่

อัปเดต:ตกลงดังนั้นหลังจากทำงานเพิ่มอีกเล็กน้อยนี่คือลักษณะของรหัสในปัจจุบัน ยังคงอยู่ระหว่างดำเนินการ แต่ตอนนี้ใกล้เข้ากับผลลัพธ์ที่ต้องการ

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)

ฉันสมมติว่าปัญหาเกี่ยวกับผลลัพธ์ที่คุณมีอยู่คือเศษส่วนไม่ง่าย / ไปสู่ค่าสัมประสิทธิ์เดียวใช่หรือไม่
Addison Crump

@FlagAsSpam เศษส่วนกำลังลดความซับซ้อน แต่ปัญหาคือพวกเขาลงเอยที่ผิดด้านของตัวแปร ยกตัวอย่างเช่นในตัวอย่างที่สามผลในx^(8/7)/8ที่ที่ถูกต้องในขณะที่ทางคณิตศาสตร์ไม่ได้อยู่ในรูปแบบที่คุณต้องการมัน (1/8)x^(8/7)-
Tom Carpenter

พิจารณาว่าคุณเป็นคำตอบเดียวที่ฉันอาจพิจารณาเปลี่ยนหากไม่มีคำตอบเพิ่มเติมในหนึ่งหรือสองวันเพื่อ "เอาท์พุทใด ๆ ที่ถูกต้องทางคณิตศาสตร์ถูกต้อง" สำหรับเศษส่วน
Addison Crump

คำตอบของคุณถูกต้อง - คุณไม่จำเป็นต้องลดความซับซ้อนของผลผลิตอีกต่อไป c:
Addison Crump

ฉันจะตีมันลงเล็กน้อยแล้วนับจำนวนไบต์
Tom Carpenter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.