提问人:yupbank 提问时间:2/25/2022 最后编辑:yupbank 更新时间:3/26/2023 访问量:184
解决多项式乘法和除法“溢出”问题
Addressing polynomial multiplication and division "overflow" issue
问:
我有一个 1 次多项式的系数列表,其中a[i][0]*x^1 + a[i][1]
a = np.array([[ 1. , 77.48514702],
[ 1. , 0. ],
[ 1. , 2.4239275 ],
[ 1. , 1.21848739],
[ 1. , 0. ],
[ 1. , 1.18181818],
[ 1. , 1.375 ],
[ 1. , 2. ],
[ 1. , 2. ],
[ 1. , 2. ]])
并在以下操作中遇到问题,
np.polydiv(reduce(np.polymul, a), a[0])[0] != reduce(np.polymul, a[1:])
哪里
In [185]: reduce(np.polymul, a[1:])
Out[185]:
array([ 1. , 12.19923307, 63.08691612, 179.21045388,
301.91486027, 301.5756213 , 165.35814595, 38.39582615,
0. , 0. ])
和
In [186]: np.polydiv(reduce(np.polymul, a), a[0])[0]
Out[186]:
array([ 1.00000000e+00, 1.21992331e+01, 6.30869161e+01, 1.79210454e+02,
3.01914860e+02, 3.01575621e+02, 1.65358169e+02, 3.83940472e+01,
1.37845155e-01, -1.06809521e+01])
首先,确切地说,余数比 0 大得多,其次,商的最后两项应该是 0,但比 0 大得多。.np.polydiv(reduce(np.polymul, a), a[0])
827.61514239
1.37845155e-01, -1.06809521e+01
我想知道我有哪些选择可以提高准确性?
答:
0赞
yupbank
4/19/2022
#1
有一种稍微复杂的方法,可以先保留产品,然后再划分结构。
首先使用积分并评估。n
a
xs = np.linspace(0, 1., 10)
ys = np.array([np.prod(list(map(lambda r: np.polyval(r, x), a))) for x in xs])
然后进行除法而不是系数。ys
ys = ys/np.array([np.polyval(a[0], x) for x in xs])
最后使用多项式插值和xs
ys
from scipy.interpolate import lagrange
lagrange(xs, ys)
找到了第二个解决方案
b = a[:,::-1]
np.polydiv(reduce(np.polymul, b), b[0])[0][::-1]
评论
1, 2
1
2
x
reduce(np.polymul, a)
reduce(np.polymul, a[1:])
a
1e-5
a[:8]
reduce(np.polymul, a[1:])
a[i][1]