使用Sympy,假设我们有一个表达式f,它是符号"x"(以及可能的其他符号)的多项式.
我想知道如果有一种有效的方法可以删除大于某个整数n的f中的所有项.
作为一个特例,我有一个非常复杂的功能,但我想只保留x中的第二个订单.有效的方法是什么?
这种明显的,非常有效的方法是每m小于n,取m个导数并将x设为0,得到x ^ m的系数.我们以这种方式获得每个系数,然后重建多项式.但是采取衍生品并不是最有效的方法.
python symbolic-math sympy computer-algebra-systems polynomials
在尝试对多项式进行建模时,特别是它们的乘法,我遇到了以下问题.在乘法期间,两个多项式的单个单项式相乘,当然可以发生我有(3x ^ 2 y + 5x y ^ 2)*(x + y).结果包含3x ^ 2 y ^ 2和5 x ^ 2 y ^ 2,我想通过添加立即组合.
当然,我想使用单项式的部分x ^ 2 y ^ 2作为(哈希)映射中的关键字来添加不同的系数(在示例中为3和5).但是我设想的单项式对象自然也应该包含系数,该系数不应该是地图键的一部分.
当然,我可以写单项对象的equals/hashcode,使它们忽略系数.但这感觉错了,因为数学上单项式显然只等于另一个,如果系数相等的话.
为中间操作引入无系数单项式对象也看起来不正确.
我没有使用地图,而是使用列表并使用二进制搜索和一个忽略系数的专用比较器.
如果没有使用不使用密钥'equals/hashcode的地图,而是使用专用的地图,那么有没有更好的想法如何融合单项式?
考虑一个多项式,例如:
p = [1 -9 27 -27];
Run Code Online (Sandbox Code Playgroud)
显然真正的根是3:
polyval(p,3)
0
Run Code Online (Sandbox Code Playgroud)
使用该roots
功能时
q = roots([1 -9 27 -27]);
Run Code Online (Sandbox Code Playgroud)
用format short
:
q =
3.0000 + 0.0000i
3.0000 + 0.0000i
3.0000 - 0.0000i
Run Code Online (Sandbox Code Playgroud)
并检查根是否真实:
bsxfun(@eq,ones(size(q)),isreal(q))
0
0
0
Run Code Online (Sandbox Code Playgroud)
format long
我得到的更糟糕的是:
roots([1 -9 27 -27])
ans =
3.000019414068325 + 0.000000000000000i
2.999990292965843 + 0.000016813349886i
2.999990292965843 - 0.000016813349886i
Run Code Online (Sandbox Code Playgroud)
如何正确计算多项式的根?
编辑:我不是问如何用给定的变量来解决方程式(如在这个假定的重复问题中),而是如何用问题中指定的另一个表示表达式.我认为这是一个具有误导性标题的"重复"问题.
我是SymPy的新手.我有一个表达,一旦表达为另一个表达式,应该变得非常好.问题是我不知道如何"强迫"用另一个表达原始表达.
这是一个基本的例子:
import sympy as sp
sp.init_printing(use_unicode=True)
a,b,c = sp.symbols('a b c')
A = a+b+c
B = a+c
C = A.subs(a+c,B) # Expected/wanted: C = B+b
C
Run Code Online (Sandbox Code Playgroud)
A.rewrite(B)
Run Code Online (Sandbox Code Playgroud)
A和B可能是相当复杂的表达.作为参考,这是我的实际情况:
import sympy as sp
sp.init_printing(use_unicode=True)
t, w, r = sp.symbols('t w r')
S = sp.Function('S')(t)
V = (S-w*(1+r)**t)/(((1+r)**t)-1)
V
Run Code Online (Sandbox Code Playgroud)
St = -(r + 1)**t*(w - S)*sp.log(r + 1)/((r + 1)**t - 1)
St
Run Code Online (Sandbox Code Playgroud)
一旦我按照V语言编写St,我应该能够简化以获得公正
St = rS(t)+ rV
但我无法在SymPy中做到这一点.
在sklearn的Polynomial Features中需要帮助.它对一个功能很有效,但每当我添加多个功能时,除了提升到度数的值之外,它还会在数组中输出一些值.例如:对于这个数组,
X=np.array([[230.1,37.8,69.2]])
Run Code Online (Sandbox Code Playgroud)
当我尝试
X_poly=poly.fit_transform(X)
Run Code Online (Sandbox Code Playgroud)
它输出
[[ 1.00000000e+00 2.30100000e+02 3.78000000e+01 6.92000000e+01
5.29460100e+04 8.69778000e+03 1.59229200e+04 1.42884000e+03
2.61576000e+03 4.78864000e+03]]
Run Code Online (Sandbox Code Playgroud)
这是8.69778000e+03,1.59229200e+04,2.61576000e+03
什么?
我已经使用查找表和低阶多项式近似实现了定点 log2 函数,但对整个 32 位定点范围 [-1,+1) 的精度不太满意。输入格式为s0.31,输出格式为s15.16。
我在这里发布这个问题,以便其他用户可以发布他的答案(一些评论在另一个线程中交换,但他们更喜欢在单独的线程中提供全面的答案)。欢迎任何其他答案,如果您能提供算法及其实现的一些速度与准确性的详细信息,我将不胜感激。
谢谢。
在此Code Review答案中:
https://codereview.stackexchange.com/a/59405/11633
我找到了以下内容(嵌套引用!):
让我引用精彩的C++数字食谱书(但也适用)
我们假设你知道永远不会以这种方式评估多项式:
Run Code Online (Sandbox Code Playgroud)p=c[0]+c[1]*x+c[2]*x*x+c[3]*x*x*x+c[4]*x*x*x*x;
或者(甚至更糟!),
Run Code Online (Sandbox Code Playgroud)p=c[0]+c[1]*x+c[2]*pow(x,2.0)+c[3]*pow(x,3.0)+c[4]*pow(x,4.0);
来(计算机)革命,所有被认定犯有此类犯罪行为的人将被即决处决,他们的计划将不会!
(您可以在分析索引中找到您的版本中的页面,在"puns,particullary bad"条目下.我喜欢这本书.)
不这样做有两个原因:准确性和性能.评估多项式的正确方法是这样的:
Run Code Online (Sandbox Code Playgroud)-t * (0.319381530 + t * (-0.356563782 + t * (1.781477937 + t * (-1.821255978 + 1.330274429 * t))))
我可以看到以任何沮丧的方式实施它的严重性能损失,但不是精确度惩罚.准确性有什么不好?
我找到了这本书,但在引用位的任何地方都找不到这些信息.
我目前正在处理多个变量的函数,需要收集类似的术语以尝试简化表达式。
说表达式写成如下:
x = sympy.Symbol('x')
y = sympy.Symbol('y')
k = sympy.Symbol('k')
a = sympy.Symbol('a')
z = k*(y**2*(a + x) + (a + x)**3/3) - k((2*k*y*(a + x)*(n - 1)*(-k*(y**2*(-a + x) + (-a + x)**3/3) + k*(y**2*(a + x) + (a + x)**3/3)) + y)**2*(-a + k*(n - 1)*(y**2 + (a + x)**2)*(-k*(y**2*(-a + x)))))
zEx = z.expand()
print type(z)
print type(zEx)
Run Code Online (Sandbox Code Playgroud)
编辑:格式化以增加清晰度并更改表达式 z 以使问题更容易理解。
Sayz
包含很多术语,需要通过眼睛筛选它们。并选择适当的条款,将花费不令人满意的时间。
我想收集所有的条款只有一个的** 1倍数。我不关心 a 的二次或更高次幂,也不关心不包含 a 的项。
的类型z
并zEx …
我不明白为什么polynomial.Polynomial.fit()
给出的系数与预期系数非常不同:
import numpy as np
x = np.linspace(0, 10, 50)
y = x**2 + 5 * x + 10
print(np.polyfit(x, y, 2))
print(np.polynomial.polynomial.polyfit(x, y, 2))
print(np.polynomial.polynomial.Polynomial.fit(x, y, 2))
Run Code Online (Sandbox Code Playgroud)
给出:
import numpy as np
x = np.linspace(0, 10, 50)
y = x**2 + 5 * x + 10
print(np.polyfit(x, y, 2))
print(np.polynomial.polynomial.polyfit(x, y, 2))
print(np.polynomial.polynomial.Polynomial.fit(x, y, 2))
Run Code Online (Sandbox Code Playgroud)
前两个结果都可以,感谢这个答案,我明白为什么两个数组的顺序相反。
但是,我不明白第三个结果的含义。尽管我以这种方式得到的多项式似乎给出了正确的预测值,但系数看起来是错误的。
我想创建一个具有这样的浮点系数的多项式环。我可以使用整数创建,但是浮点数不起作用。
using Oscar
S, (a,b,c,d) = PolynomialRing(QQ,["a","b","c","d"])
RR = AbstractAlgebra.RealField
s1 = S( 8*a - RR(0.51234)*a*(1+RR(1/2)*a+RR(1/3)*b+RR(1/4)*c) - 8)
s2 = S( 8*b - RR(0.51234)*b*(1+RR(2/3)*a+RR(2/4)*b+RR(2/5)*c) - 8)
s3 = S( 8*c - RR(0.51234)*c*(1+RR(3/4)*a+RR(3/5)*b+RR(3/6)*c) - 8)
s4 = S( 8*d - RR(0.51234)*d*(1+RR(4/5)*a+RR(4/6)*b+RR(4/7)*c) - 8)
Run Code Online (Sandbox Code Playgroud)
它给了我这个错误。我怎样才能创建这样的多项式。
ERROR: LoadError: MethodError: no method matching (::FmpqMPolyRing)(::BigFloat)
Closest candidates are:
(::FmpqMPolyRing)() at ~/.julia/packages/Nemo/5CDLD/src/flint/fmpq_mpoly.jl:1063
(::AbstractAlgebra.Ring)(::Singular.n_RingElem{Singular.RingElemWrapper{S, T}}) where {S, T} at ~/.julia/packages/Singular/uG7uo/src/number/n_unknown.jl:358
(::AbstractAlgebra.Ring)(::Union{Singular.n_FieldElem{T}, Singular.n_RingElem{T}} where T) at ~/.julia/packages/Oscar/iRpOQ/src/Rings/mpoly.jl:736
...
Stacktrace:
[1] *(x::BigFloat, y::fmpq_mpoly)
@ AbstractAlgebra ~/.julia/packages/AbstractAlgebra/mQIYL/src/Rings.jl:84
[2] top-level scope …
Run Code Online (Sandbox Code Playgroud) polynomials ×10
python ×4
sympy ×3
math ×2
coefficients ×1
fixed-point ×1
hashmap ×1
java ×1
julia ×1
logarithm ×1
matlab ×1
numpy ×1
python-2.7 ×1
scikit-learn ×1