多项式的符号积分


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个字符的变量(即f
      • 这仅适用于ASCII范围65-90和97-122。
    • 您不必使用链式规则或集成x^(-1)
  • 输出必须有填充(两个词之间的分隔符,即x^2 + x + C
  • 如果不知道如何与上述功能集成,则应打印出该程序"Cannot integrate "+input
  • 它必须是完整程序。

奖金:

  • 如果您打印出用于降价格式的“漂亮”指数(而不是)x^2,则为-10%x<sup>2</sup>
  • 如果您打印出等式(即∫xdx = (1/2)x^2 + C),则为-10%

例子:

输入:

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
Digital Trauma 2015年

3
1.我假设除e和之外π,系数中唯一的值将是有理数?也就是说,没有必要处理多元多项式吗?2.当您说“ non-x 1-char variables ”时,您是要限制a-zA-Z还是打算包含其他Unicode范围?
彼得·泰勒

1
您是否认为如果某人的程序打印ln(x) + C输入为,应该有奖金x^(-1)吗?
Arcturus

1
@Ampora否-打开一整罐蠕虫,处理ln系数。
艾迪生·克伦普

1
@LeifWillerts 1)我的意思是那x^(e+1)将不是一个整数,但是可能是一个积分的结果。2)不会有多个字母变量。3)是的。4)是的,但是应该如此(1/56)x^(1/7+1) + C(我在示例中犯了一个错误)。
Addison Crump

Answers:


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

这将创建一个真正的函数φ,该函数以一个String作为输入。(那可以算作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)

我认为输出的问题是分数没有简化/变成单个系数?
艾迪生·克伦普

@FlagAsSpam,分数正在简化,但是麻烦在于它们最终位于变量的错误一侧。例如,在第三个示例中,得出的结果是x^(8/7)/8,尽管数学上正确,但您所希望的形式不是- (1/8)x^(8/7)
汤姆·卡彭特

考虑到您是到目前为止唯一的答案,我可能会考虑将如果一两天之内没有答案的分数更改为“任何数学上正确的有效输出”。
艾迪生·克伦普

您的答案是正确的-您不必再简化分数输出了。c:
Addison Crump 2015年

然后我将它打一点,然后计算字节数。
汤姆·卡彭特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.