为了解决不确定的积分问题,我提出了一个与本书解决方案不一致的解决方案.为了检查我的解决方案,我尝试使用此代码解决问题:
syms x
question=int(1/(x*(1+x^5)^0.5))`
mysolution=(1/5)*(log(((sqrt(1+x^5))-1)/(sqrt(1+x^5)+1)))
x=3
eval(question)
eval(mysolution)
Run Code Online (Sandbox Code Playgroud)
结果导致:
ans =-0.0256 - 0.6283i
ans =-0.0256
Run Code Online (Sandbox Code Playgroud)
我必须找到一个不定积分的解决方案但是当我给MATLAB这个问题(解决不定积分)时,它给了另一个解决方案.为了检查我的解决方案是否是正确的,我给x使用值3 syms和eval,所以MATLAB应该显示我的回答和他自己的答案与假设x=3.
MATLAB答案的真实部分与我的答案相同,但它包含一个虚构的部分,这与我的解决方案不符.事实上,我的答案x=3并不包含任何想象中的部分.有什么不对,为什么会这样?
这是一个数学问题,而不是一个编程问题.
您的无限积分可写为:
-2/5 * atanh(sqrt(1+x^5))
Run Code Online (Sandbox Code Playgroud)
这等于你的解决方案,因为
atanh(z) = 1/2 ln( (1+z) / (1-z) )
Run Code Online (Sandbox Code Playgroud)
现在,如果我们看看Matlab正在计算什么,它说
(2*atan((x^5 + 1)^(1/2)*i)*i)/5
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为
atan(x*i) = i*atanh(x)
Run Code Online (Sandbox Code Playgroud)
现在让我们考虑一下matlab解决方案的虚部:让我们回想一下,ln复杂的数字并没有唯一的定义,而是有不同的分支.这是因为复指数函数是2*pi*i周期性的:
exp(x) = exp(x + 2*pi*i)
Run Code Online (Sandbox Code Playgroud)
这是复杂对数的"多值"表示的虚构部分,可以看出这种情况,你可以说
" log(z) = log(z) + 2*pi*i "
Run Code Online (Sandbox Code Playgroud)
所以,如果我们回到你的具体例子:想象中的部分是- 0.6283你的
-2/5 * atanh(sqrt(1+x^5))=-2/5 * 1/2 * ln((1+sqrt(1+x^5))/(1-sqrt(1+x^5)))
let z = sqrt(1+x^5)
= -2/5 * 1/2 * ln((1+z)/(1-z))
let w = (1+z)/(1-z)
= -1/5 * ln(w)
= -1/5 * [ ln(-w) + ln(-1) ]
= -1/5 * [ ln(-w) - pi*i] since exp(-pi*i)=-1
now apply the "equation" in quotation marks
"=" -1/5 * [ ln(-w) + 2*pi - pi*i]
= -1/5 * ln(-w) - 1/5*pi*i
Run Code Online (Sandbox Code Playgroud)
你猜怎么着: -1/5*pi*i = - 0.6283i
所以这是因为Matlab基本上试图找到负值的对数,因此是虚部-pi*i.
所以这里的教训是:小心复杂的数字:D(或者小心matlab的符号数学例程......)