Matlab与Real的符号集成给出了一个复杂的答案

时间:2018-12-08 22:59:38

标签: matlab symbolic-math

我希望对Matlab中的以下积分获得解析(封闭形式)解决方案。但是,Matlab给我有关实部和虚部的答案。如何获得仅包含“真实”部分的答案。这是完整的代码。

# ---- Image from video

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)

# if the average frame is None, initialize it
if average is None:
    print("[INFO] starting background model...")
    average = gray.copy().astype("float")
    return 0, image

# accumulate the weighted average between the current frame and
# previous frames, then compute the difference between the current
# frame and running average
cv2.accumulateWeighted(gray, average, 0.5)
frame_delta = cv2.absdiff(gray, cv2.convertScaleAbs(average))

# threshold the delta image, dilate the thresholded image to fill
# in holes, then find contours on thresholded image
thresh = cv2.threshold(frame_delta, var_sis.config["delta_thresh"], 255,
                       cv2.THRESH_BINARY)[1]

thresh = cv2.dilate(thresh, None, iterations=2)

cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
                        cv2.CHAIN_APPROX_SIMPLE)

cnts = cnts[0] if imutils.is_cv2() else cnts[1]

sorted contours = sorted(cnts, key=lambda x: cv2.contourArea(x), reverse=True)

# -----> I got contourns 

2 个答案:

答案 0 :(得分:2)

您所获得的(具有某些恒定因素)具有以下形式

✔ using the Infinite Red boilerplate v3 (code name 'Bowser')
✔ added React Native 0.57.7 in 38.8s
an error occured while installing ignite-ir-boilerplate-bowser boilerplate.
Error: template not found /Users/tyler/Github/ReactNativeBowser/node_modules/ignite-ir-boilerplate-bowser/boilerplate/.gitignore

这由表格的两个术语组成

 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) 的实值,您的表达式实际上是真实的,并且xthetak >= 0sik是实数时就是这种情况。

您开始使用的积分可以简化为sjk的积分(使用某种仿射变换),众所周知,该积分没有“闭合形式”,但通常写为

exp(-t^2)

我强烈建议您阅读error function上的Wikipedia文章。

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

(由于SO上缺少LaTeX,因此全部以MATLAB表示法编写。)

答案 1 :(得分: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 *((((tA)^ 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))$$