Tích hợp tượng trưng của đa thức


21

Áp dụng một tích phân không xác định cho một chuỗi nhất định. Các quy tắc duy nhất bạn sẽ sử dụng được xác định như sau:

∫cx ^ (n) dx = (c / (n + 1)) x ^ (n + 1) + C, n ≠ -1
c, C và n đều là hằng số.

Thông số kỹ thuật:

  • Bạn phải có khả năng tích hợp đa thức với bất kỳ tính năng nào có thể:
    • Một hệ số, có thể là một phần trong định dạng (numerator/denominator).
    • Công nhận rằng e và π là hằng số, và trong quá trình sử dụng, có thể tạo thành phân số hoặc biểu thức có chứa chúng (có thể được giữ trong một phân số như (e/denominator)hoặc (numerator/e), hoặc, theo số mũ, x^(e+1))
      • Ngoài hai hằng số đặc biệt này, tất cả các hệ số sẽ là số thực, số thực.
    • Một số mũ, có thể là một phần, trong định dạng x^(exponent)
      • Biểu hiện với ehoặc πtrong chúng, ngoài bản thân chúng, sẽ không được tính theo cấp số nhân. (bạn sẽ không phải tích hợp những thứ như x^(e+1), nhưng bạn có thể tích hợp x^(e))
    • Có thể sử dụng các biến không x 1-char (tức là f)
      • Điều này chỉ dành cho ASCII trong phạm vi 65-90 và 97-122.
    • Bạn không phải sử dụng quy tắc chuỗi hoặc tích hợp x^(-1).
  • Đầu ra phải có phần đệm (tách giữa các điều khoản, nghĩa là x^2 + x + C.
  • Nếu không biết cách tích hợp với các tính năng trên, chương trình sẽ in ra "Cannot integrate "+input.
  • Nó phải là một chương trình đầy đủ.

Tiền thưởng:

  • -10% nếu bạn in ra số mũ "đẹp" được định dạng để đánh dấu (thay vì x^2, x<sup>2</sup>).
  • -10% nếu bạn in ra phương trình (nghĩa là ∫xdx = (1/2)x^2 + C)

Ví dụ:

Đầu vào:

x

Đầu ra:

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

Đầu vào:

-f^(-2)

Đầu ra:

f^(-1) + C

Đầu vào:

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

Đầu ra:

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

Đầu vào:

πx^e

Đầu ra:

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

Đầu vào:

(f+1)^(-1)

Đầu ra:

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

1
Ngạc nhiên là chúng tôi không có câu hỏi này - nhưng tôi không thể tìm thấy một bản sao. +1
Chấn thương kỹ thuật số

3
1. Tôi cho rằng khác eπ, các giá trị duy nhất trong các hệ số sẽ là số hữu tỉ? Tức là không cần thiết phải xử lý đa thức đa biến? 2. Khi bạn nói "biến không phải là 1 biến char ", bạn có đang giới hạn a-zA-Zhoặc bạn có ý định bao gồm các phạm vi Unicode khác không?
Peter Taylor

1
Bạn có nghĩ nên có một phần thưởng nếu chương trình của ai đó in ln(x) + Ccho đầu vào x^(-1)không?
Arcturus

1
@Ampora Không - điều đó mở ra một loạt các con giun đối phó với các hệ số của ln.
Addison Crump

1
@LeifWillerts 1) Ý tôi là đó x^(e+1)sẽ không phải là một thương hiệu, nhưng nó có thể là kết quả của sự tích hợp. 2) Sẽ không có nhiều biến chữ. 3) Có. 4) Có, nhưng nó phải như vậy (1/56)x^(1/7+1) + C(Tôi đã mắc lỗi trong các ví dụ).
Addison Crump

Câu trả lời:


2

Toán học 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",σ]])&

Điều này tạo ra một hàm thực lấy một Chuỗi làm Đầu vào. (Điều đó có được tính là chương trình hoàn chỉnh cho Mathematica không?)

Phiên bản không có bản quyền sẽ là:

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

Lưu ý rằng các chữ cái Hy Lạp là cần thiết để có thể sử dụng tất cả các chữ cái khác trong đầu vào.


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

Đây hiện là một công việc đang thực hiện bằng cách sử dụng MATLAB được xây dựng trong khả năng tích hợp tượng trưng. Hiện tại các yêu cầu đã được cập nhật để định dạng phù hợp với yêu cầu. Nó cũng đủ điều kiện nhận tiền thưởng -10% thứ hai.

Nếu bất cứ ai muốn tham gia và đề xuất các cách sửa lỗi đầu ra, hoặc sử dụng mã này làm cơ sở cho câu trả lời khác, vui lòng :). Nếu tôi có thể tìm thấy thời gian, tôi sẽ tiếp tục chơi với nó và xem liệu tôi có thể nghĩ cách định dạng lại đầu ra không.

Cập nhật: Ok, vì vậy sau khi làm việc nhiều hơn một chút, đây là cách mã hiện đang đứng. Đây vẫn là một công việc đang tiến triển, nhưng bây giờ đang tiến gần hơn để phù hợp với đầu ra cần thiết.

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

Dưới đây là một số ví dụ về những gì nó hiện đang sản xuất. Như bạn có thể thấy, nó không hoàn toàn đúng, nhưng ngày càng gần hơn.

Đầu vào:

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

Đầu ra:

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

Tôi giả sử vấn đề với đầu ra mà bạn gặp phải là các phân số không đơn giản hóa / đi vào một hệ số duy nhất?
Addison Crump

@FlagAsSpam, các phân số được đơn giản hóa, nhưng rắc rối là chúng kết thúc ở phía sai của biến. Ví dụ, trong ví dụ thứ ba, kết quả trong x^(8/7)/8đó về mặt toán học không đúng ở dạng bạn muốn - (1/8)x^(8/7).
Tom Carpenter

Xem xét rằng bạn là câu trả lời duy nhất cho đến nay, tôi có thể xem xét thay đổi rằng nếu không có thêm câu trả lời nào trong một hoặc hai ngày để "bất kỳ đầu ra hợp lệ, chính xác về mặt toán học" cho các phân số.
Addison Crump

Câu trả lời của bạn là hợp lệ - Bạn không phải đơn giản hóa đầu ra phân đoạn nữa. c:
Addison Crump

Tôi sẽ đánh nó xuống một chút sau đó và đếm các byte.
Tom Carpenter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.