Mathematica和Python的超越方程解不匹配
我在解一个超越方程组: cosx/x=0.48283+a*3.46891 cosy/y=0.47814+b*28.6418 a+b=1 1.02*sincx=1.03*sincy 碰巧我尝试用两种不同的编程语言Mathematica和Python来解决上述系统 数学软件 运行代码Mathematica和Python的超越方程解不匹配,python,numpy,wolfram-mathematica,root,Python,Numpy,Wolfram Mathematica,Root,我在解一个超越方程组: cosx/x=0.48283+a*3.46891 cosy/y=0.47814+b*28.6418 a+b=1 1.02*sincx=1.03*sincy 碰巧我尝试用两种不同的编程语言Mathematica和Python来解决上述系统 数学软件 运行代码 FindRoot[{Cos[x]/x == 0.482828 + a*3.46891, Cos[y]/y == 0.47814 + b*28.6418, a + b == 1, 1.02*Sinc[x] =
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}
array([ 0.26843418, 0.27872813, 0.89626625, 0.10373375])
python
运行代码:
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
返回
{x -> 0.261727, y -> 0.355888, a -> 0.924737, b -> 0.0752628}
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
嗯?嗯
numpy.sincx
返回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
sinc函数是sinπx/πx
哎呀。NumPy的sinc比Mathematica的sinc有更大的优势
Mathematica的Sinc使用非规范化定义sinx/x。这个定义通常用于数学和物理。
NumPy的sinc使用标准化版本sinπx/πx。这个定义通常用于数字信号处理和信息理论。它被称为标准化,因为
∫-∞∞ sinπx/πx dx=1。
因此,如果希望NumPy产生与Mathematica相同的结果,则需要将x和y除以np.pi
由于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
嗯?嗯
numpy.sincx
返回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
sinc函数是sinπx/πx
哎呀。NumPy的sinc比Mathematica的sinc有更大的优势
Mathematica的Sinc使用非规范化定义sinx/x。这个定义通常用于数学和物理。
NumPy的sinc使用标准化版本sinπx/πx。这个定义通常用于数字信号处理和信息理论。它被称为标准化,因为
∫-∞∞ sinπx/πx dx=1。
因此,如果希望NumPy产生与Mathematica相同的结果,则需要将x和y除以np.pi
含糖的谢谢。请再加上这一行。在数学中,sinc指的是非规范化版本。因此,sincx=sinx/x。Numpy使用规范化版本。容易记住。因此,sincx=sinpi*x/pi。x@kmario23完成。这实际上在维基百科的链接文章中有解释。@kennytm谢谢,现在答案看起来很优雅。为了完整起见,我要求将其添加到这里,并以自己的方式给出答案!谢谢。请再加上这一行。在数学中,sinc指的是非规范化版本。因此,sincx=sinx/x。Numpy使用规范化版本。容易记住。因此,sincx=sinpi*x/pi。x@kmario23完成。这实际上在维基百科的链接文章中有解释。@kennytm谢谢,现在答案看起来很优雅。我要求将其添加到这里,以确保答案本身的完整性