【问题标题】:matlab symbolic integration with real gives a complex answermatlab symbolic integration with real 给出了一个复杂的答案
【发布时间】:2018-12-08 22:59:37
【问题描述】:

我希望在 Matlab 中得到以下积分的解析(封闭形式)解。然而,Matlab 给了我一个带有实部和虚部的答案。我如何让它只用“真实”部分产生答案。这是完整的代码。

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);

【问题讨论】:

  • PS:我想要一个只包含实部的封闭式解析表达式。虚部确实为零(但函数“real”不能只给我实部)。
  • 小备注:“simplify(collect(expand(Bijk_raw)))”应该是简单的“simplify(expand(Bijk_raw))”(不需要收集任何东西)。
  • 实际上,我尝试了收集和不收集。使用 collect 给出了一个更简洁的答案。

标签: matlab symbolic-math


【解决方案1】:

您获得的答案(如果您有与我类似的 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”,而这个“i”又会“杀死”与它“接触”的其他“i”。由于可以找到 (-thetak)^(1/2) 的事实,这种取消将在不同的地方发生:

1) 在 erf 表达式中和

2) 作为公分母(最后一行)。

验证规则 i^2=-1 是否适用于所有地方,不会让任何“i”的生存机会...

终于给了(我已将 thetak=s^2 设置为 s>0):

  /               /                      \ 
  |  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                 /   / / 

编辑:您可能已经逃脱了集成。这个想法是在所谓的“规范形式”下将 $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 明确地生成一个没有虚部的答案。我添加了“假设(thetak > 0)”。
  • 我没有想到这种限制变量域的可能性。关于你的问题的数学方面,我有一个相当重要的额外评论;我将对此发表另一条评论(待跟进)
  • 我在我的回答中以“编辑”的形式添加了我的评论。
【解决方案2】:

你得到的有(最多一些常数因素)形式

 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 >= 0siksjk 是实数,情况就是如此。

你开始的积分可以简化为exp(-t^2)的积分(使用一些仿射变换),众所周知,它没有“封闭形式”,但它通常写成

erf(x) = 2/sqrt(pi) * integral(@(t)exp(-t.^2),0,x)

我强烈建议阅读error function 上的维基百科文章。

此外,我建议使用比 MATLAB 符号工具箱更适合初学者的 CAS。我喜欢推荐的一种免费开源 CAS 是 Maxima

(由于 SO 上没有 LaTeX,这都是用 MATLAB 表示法编写的。)

【讨论】:

  • 感谢您提供的信息丰富的回答。错误函数是可以的(因为我认为它是为了我的目的而关闭的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多