matlab 与 real 的符号积分给出了一个复杂的答案
matlab symbolic integration with real gives a complex answer
我希望在 Matlab 中得到以下积分的解析(封闭形式)解。然而,Matlab 给了我一个实部和虚部的答案。我如何让它只用 "real" 部分产生答案。这是完整的代码。
close all;
clear all;
clc;
syms t real;
syms thetak real;
syms sik real;
syms tbar real;
syms sjk real;
expr = exp(-thetak*((t-sik)^2 + (t-sjk)^2));
Bijk_raw = int(expr,t,0,1);
Bijk = simplify(collect(expand(Bijk_raw)));
fprintf('Bijk is as follows...\n');
pretty(Bijk);
你得到的(取决于一些常数因子)形式
1i * (c * erf(1i * a) - erf(c * 1i * (a - 2)))
这由两个形式的术语组成
- 1i * erf(1i * x)
也称为 虚数误差函数 erfi()
。结果是
erfi(x) = - 1i * erf(1i * x) = 2/sqrt(pi) * integral(@(t)exp(t.^2),0,x)
所以对于 x
的实数值,你的表达式实际上是实数,如果 thetak >= 0
和 sik
和 sjk
是实数,情况就是这样。
你开始的积分可以简化为 exp(-t^2)
的积分(使用一些仿射变换),众所周知它没有 "closed form",但通常写成
erf(x) = 2/sqrt(pi) * integral(@(t)exp(-t.^2),0,x)
我强烈建议阅读 error function 上的维基百科文章。
此外,我建议使用更适合初学者的 CAS than the MATLAB symbolic toolbox. One free and opensource CAS I like to recommend is Maxima。
(由于SO上缺少LaTeX,这里全部用MATLAB符号写成。)
您获得的答案(如果您有与我类似的 Matlab 版本)并且我在此处重现:
/ / 2 \
| 1/2 1/2 | thetak (sik - sjk) |
- | 2 pi exp| - ------------------- |
\ \ 2 /
/ / 1/2 1/2 \
| | 2 (-thetak) (sik i + sjk i) |
| erf| --------------------------------- | i -
\ \ 2 /
/ 1/2 1/2 \ \ \
| 2 (-thetak) (sik i + sjk i - 2 i) | | |
erf| --------------------------------------- | i | | /
\ 2 / / /
1/2
(4 (-thetak) )
给人的印象是你到处都是复数 i。
但实际上由于(-thetak)^(1/2),这是一个错误的印象。
确实,对一个负数求平方根会生成一个 "i",它又会 "kill" 与它 "in contact" 的其他 "i"。由于可以找到 (-thetak)^(1/2) 的事实,这种取消将发生在不同的地方:
1) erf 表达式内部和
2) 作为共同点(最后一行)。
验证规则 i^2=-1 适用于所有地方,不给任何 "i"...
的生存机会
终于给出了(我设置了 s>0 的 thetak=s^2):
/ / \
| 1/2 1/2 | s^2 (sik - sjk)^2 |
- | 2 pi exp| - ------------------- |
\ \ 2 /
/ / 1/2 \
| | 2 s (sik + sjk ) |
| erf| ----------------------- | -
\ \ 2 /
/ 1/2 \ \ \
| 2 s (sik + sjk - 2 ) | | |
erf| ----------------------------- | | | / (4 s)
\ 2 / / /
编辑:您本可以逃脱整合。这个想法是在所谓的 "canonical form" 下转换 $exp(-thetak*((t-sik)^2 + (t-sjk)^2))$ 的二次,在你的情况下是: $ exp(-thetak*(((t-A)^2 + B))/C);$ 其中 $A,B,C$ 可以表示为 sik 和 sjk 的函数(例如 $A=(sik+sjk)/ 2$);通过这种方式,设置 $T=t-A$,您将回到经典的高斯积分,公式为:
$$\frac{2}/{\sqrt{\pi}}\int_a^b exp(-t^2} dt) (erf(b) - erf(a))$ $
我希望在 Matlab 中得到以下积分的解析(封闭形式)解。然而,Matlab 给了我一个实部和虚部的答案。我如何让它只用 "real" 部分产生答案。这是完整的代码。
close all;
clear all;
clc;
syms t real;
syms thetak real;
syms sik real;
syms tbar real;
syms sjk real;
expr = exp(-thetak*((t-sik)^2 + (t-sjk)^2));
Bijk_raw = int(expr,t,0,1);
Bijk = simplify(collect(expand(Bijk_raw)));
fprintf('Bijk is as follows...\n');
pretty(Bijk);
你得到的(取决于一些常数因子)形式
1i * (c * erf(1i * a) - erf(c * 1i * (a - 2)))
这由两个形式的术语组成
- 1i * erf(1i * x)
也称为 虚数误差函数 erfi()
。结果是
erfi(x) = - 1i * erf(1i * x) = 2/sqrt(pi) * integral(@(t)exp(t.^2),0,x)
所以对于 x
的实数值,你的表达式实际上是实数,如果 thetak >= 0
和 sik
和 sjk
是实数,情况就是这样。
你开始的积分可以简化为 exp(-t^2)
的积分(使用一些仿射变换),众所周知它没有 "closed form",但通常写成
erf(x) = 2/sqrt(pi) * integral(@(t)exp(-t.^2),0,x)
我强烈建议阅读 error function 上的维基百科文章。
此外,我建议使用更适合初学者的 CAS than the MATLAB symbolic toolbox. One free and opensource CAS I like to recommend is Maxima。
(由于SO上缺少LaTeX,这里全部用MATLAB符号写成。)
您获得的答案(如果您有与我类似的 Matlab 版本)并且我在此处重现:
/ / 2 \
| 1/2 1/2 | thetak (sik - sjk) |
- | 2 pi exp| - ------------------- |
\ \ 2 /
/ / 1/2 1/2 \
| | 2 (-thetak) (sik i + sjk i) |
| erf| --------------------------------- | i -
\ \ 2 /
/ 1/2 1/2 \ \ \
| 2 (-thetak) (sik i + sjk i - 2 i) | | |
erf| --------------------------------------- | i | | /
\ 2 / / /
1/2
(4 (-thetak) )
给人的印象是你到处都是复数 i。
但实际上由于(-thetak)^(1/2),这是一个错误的印象。
确实,对一个负数求平方根会生成一个 "i",它又会 "kill" 与它 "in contact" 的其他 "i"。由于可以找到 (-thetak)^(1/2) 的事实,这种取消将发生在不同的地方:
1) erf 表达式内部和
2) 作为共同点(最后一行)。
验证规则 i^2=-1 适用于所有地方,不给任何 "i"...
的生存机会终于给出了(我设置了 s>0 的 thetak=s^2):
/ / \
| 1/2 1/2 | s^2 (sik - sjk)^2 |
- | 2 pi exp| - ------------------- |
\ \ 2 /
/ / 1/2 \
| | 2 s (sik + sjk ) |
| erf| ----------------------- | -
\ \ 2 /
/ 1/2 \ \ \
| 2 s (sik + sjk - 2 ) | | |
erf| ----------------------------- | | | / (4 s)
\ 2 / / /
编辑:您本可以逃脱整合。这个想法是在所谓的 "canonical form" 下转换 $exp(-thetak*((t-sik)^2 + (t-sjk)^2))$ 的二次,在你的情况下是: $ exp(-thetak*(((t-A)^2 + B))/C);$ 其中 $A,B,C$ 可以表示为 sik 和 sjk 的函数(例如 $A=(sik+sjk)/ 2$);通过这种方式,设置 $T=t-A$,您将回到经典的高斯积分,公式为:
$$\frac{2}/{\sqrt{\pi}}\int_a^b exp(-t^2} dt) (erf(b) - erf(a))$ $