我正在解决一个超越方程组:


cos(x) / x = 0.48283 + a*3.46891
cos(y) / y = 0.47814 + b*28.6418
a + b = 1
1.02 * sinc(x) = 1.03 * sinc(y)


碰巧的是,我试图用两种独立的编程语言(Mathematica和Python)解决上述系统

Mathematica

运行代码

FindRoot[{Cos[x]/x == 0.482828 + a*3.46891,
  Cos[y]/y == 0.47814 + b*28.6418, a + b == 1,
  1.02*Sinc[x] == 1.03*Sinc[y]}, {{x, .2}, {y, .2}, {a, 0.3}, {b,
   0.3}}, PrecisionGoal -> 6]


退货

{x -> 0.261727, y -> 0.355888, a -> 0.924737, b -> 0.0752628}


蟒蛇

运行代码:

import numpy as np
from scipy.optimize import root

def fuuu(X, en,dv,tri,sti):
        x, y, a, b = X

        F = [np.cos(x) / x - en-a*dv,
             np.cos(y) / y - tri-b*sti,
             a + b - 1,
             1.02 * np.sinc(x) - 1.03 * np.sinc(y)]

        return F
    root(fuuu, [0.2, 0.2, 0.3, 0.3], args=(0.482828,3.46891,0.47814,28.6418)).x


退货

array([ 0.26843418,  0.27872813,  0.89626625,  0.10373375])


比较方式

假设x值相同。让我们忽略一下小的差异。但是y值相差英里!物理意义完全改变。由于某些原因,我相信Mathematica的价值要比我相信Python的价值高。

问题:


为什么计算不同?
现在哪一个是正确的?我必须在python中进行哪些更改(假设python是有问题的)?

最佳答案

由于sinc函数,计算有所不同。

(* Mathematica *)
In[1] := Sinc[0.26843418]
Out[1] = 0.988034

# Python
>>> np.sinc(0.26843418)
0.88561519683835599
>>> np.sin(0.26843418) / 0.26843418
0.98803370932709034


??好吧let's RTFM


  numpy.sinc(x)
  
  返回sinc函数。
  
  sinc函数为sin(πx)/(πx)。


哎呀。 NumPy的sinc比Mathematica的Sinc具有different definition


Mathematica的Sinc使用未标准化的定义sin(x)/ x。该定义通常用于数学和物理学。
NumPy的sinc使用归一化版本sin(πx)/(πx)。此定义通常用于数字信号处理和信息论中。之所以称为归一化是因为
∫-∞∞sin(πx)/(πx)dx = 1。


因此,如果希望NumPy产生与Mathematica相同的结果,则需要将xy除以np.pi

def fuuu(X, en,dv,tri,sti):
    x, y, a, b = X
    F = [np.cos(x) / x - en-a*dv,
         np.cos(y) / y - tri-b*sti,
         a + b - 1,
         1.02 * np.sinc(x/np.pi) - 1.03 * np.sinc(y/np.pi)]    # <---
    return F




>>> root(fuuu, [0.2, 0.2, 0.3, 0.3], args=(0.482828,3.46891,0.47814,28.6418)).x
array([ 0.26172691,  0.3558877 ,  0.92473722,  0.07526278])

关于python - 来自Mathematica和Python的超越方程的解决方案不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43212214/

10-09 10:01