Sympy: Drop higher order terms in polynomial

Using Sympy, say we have an expression f, which is a polynomial of the Symbol "x" (and of potentially other symbols).

I would like to know what if there is an efficient way to drop all terms in f of order greater than some integer n.

As a special case I have a very complicated function but i want to only keep terms up to 2nd order in x. What's the efficient way to do this?

The obvious, not-very-efficient way to do it would be for each m less than n, take m derivatives and set x to 0 to obtain the coefficient of x^m. We obtain each coefficient this way then reconstruct the polynomial. But taking derivatives is not the most efficient thing.


An easy way to do this is to add O(x**n) to the expression, like

In [23]: x + x**2 + x**4 + x**10 + O(x**3)
     2    ⎛ 3⎞
x + x  + O⎝x ⎠

If you want to later remove it, use the removeO method

In [24]: (x + x**2 + x**4 + x**10 + O(x**3)).removeO()
x  + x

You can also use series to take the series expansion of the expression. The difference here is the behavior if a non-polynomial term ends up in the expression:

In [25]: x + sin(x) + O(x**3)
              ⎛ 3⎞
sin(x) + x + O⎝x ⎠

In [26]: (x + sin(x)).series(x, 0, 3)
       ⎛ 3⎞
2⋅x + O⎝x ⎠

If you take a look at the polynomial module docs:


there will be plenty of ways to go about it, depending on the specifics of your situation. A couple different ways that would work:

Using .coeffs():

>>> f = 3 * x**3 + 2 * x**2 + x * y + y**3 + 1
>>> order = 2

>>> coeffs = Poly(f, x).coeffs()
>>> f_new = sum(x**n * coeffs[-(n+1)] for n in range(order+1)) # the +1 is to get 0th order
>>> f_new
2*x**2 + x*y + y**3 + 1

Alternatively, you could iterate over items in .all_terms():

>>> all_terms = Poly(f, x).all_terms()
>>> sum(x**n * term for (n,), term in all_terms() if n <= order)

There are plenty of manipulation functions in the module that you should be able to work with the expression directly rather than doing calculations/taking derivatives/etc.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

  • Sympy中的多元泰勒近似(Multivariate Taylor approximation in sympy)
    问题 我的目标是使用sympy编写sympy ,其中 使用尽可能多的内置代码, 计算两个变量的给定函数的截断泰勒逼近返回不包含Big-O-remainder项的结果,例如,在sin(x)=x - x**3/6 + O(x**4) 。 这是我到目前为止尝试过的: 方法1 天真的,对于每个变量,它只能对series命令进行两次组合,不幸的是,这是行不通的,如本例所示的函数sin(x*cos(y)) : sp.sin(x*sp.cos(y)).series(x,x0=0,n=3).series(y,x0=0,n=3) >>> NotImplementedError: not sure of order of O(y**3) + O(x**3) 方法2 根据这篇文章,我首先写了一维泰勒近似值: def taylor_approximation(expr, x, max_order): taylor_series = expr.series(x=x, n=None) return sum([next(taylor_series) for i in range(max_order)]) 用一维示例检查它可以正常工作 mport sympy as sp x=sp.Symbol('x') y=sp.Symbol('y') taylor_approximation(sp.sin(x*sp.cos(y
  • Printing a polynomial so that the powers of x or s are in ascending or descending order
    I can't find a method or function that will order the powers of the polynomial terms in either ascending or descending order. I am using sympy to calculate some transfer functions using Laplace transforms. I have found only collect() helps combine powers of s but it can't print the powers of s in ascending or descending order. I see print outs like this CLTF(s)=(K*Kd*ω**2*s + K*Kp*ω**2)/(K*Kp*ω**2 + 2*ζ*ω*s**2 + s**3 + s*(K*Kd*ω**2 + ω**2)) The powers of s are not in the right order in the denominator from math import pi from sympy import symbols, init_printing, ratsimp, fraction, pprint
  • 在Sympy中隔离多元多项式的一个系数的最佳方法(Best way to isolate one coefficient of a multivariate polynomial in sympy)
    问题 我有一个多元多项式(在一般情况下,它包含许多变量),其系数列出了一些需要读取的数据,但是看起来sympy并没有提供一种很好的方法。 collect函数似乎是正确的主意,但是当您将其与多个变量一起使用时,它实际上并没有为您提供单独的单项式,而是取决于列出变量顺序的奇怪的单项式分组。 有人知道这样做的方法吗? 回答1 多项式模块的文档列出了许多处理系数的方法。 例如: >>> import sympy >>> x,y,z = sympy.symbols('x,y,z') >>> p = sympy.poly((x+2*y-z)**3) >>> p.coeffs() [1, 6, -3, 12, -12, 3, 8, -12, 6, -1] 这些是按字典顺序的非零系数。 要按匹配顺序查看单项式,请使用 >>> p.monoms() [(3, 0, 0), (2, 1, 0), (2, 0, 1), (1, 2, 0), (1, 1, 1), (1, 0, 2), (0, 3, 0), (0, 2, 1), (0, 1, 2), (0, 0, 3)] 要获取特定单项式的系数,请使用 >>> p.coeff_monomial(x**2*y) 6 回答2 列出多项式的单项式,以便生成器出现(并且该顺序在用户的控制下): >>> from sympy import Poly >>>
  • Best way to isolate one coefficient of a multivariate polynomial in sympy
    I have a multivariate polynomial (which in the general case many many variables) whose coefficients list some data that I need to read off, but it doesn't seem like sympy gives a good way to do this. The collect function seemed like the right idea, but when you use it with several variables, it doesn't actually give you the individual monomials, but rather strange groupings of monomials that depend on the order you listed the variables. Does anyone know of a way to do this?
  • Speeding up computation of symbolic determinant in SymPy
    I have a 4x4 matrix A with rather long but simple symbolic expressions in each of its entries. About 30 different symbols are involved. By "simple" I mean that these symbols are combined using only addition/subtraction, multiplication/division, and integer powers. By "long" I mean that if I print out the matrix, it covers three or four screens worth. I need the determinant of this matrix. Or, to be more specific, I know that the determinant is a fourth-order polynomial in one particular symbol, and I need the coefficients of this polynomial. A.det() does not terminate after hours and hours of
  • AVX2中log2(__m256d)的高效实现(Efficient implementation of log2(__m256d) in AVX2)
    问题 SVML 的__m256d _mm256_log2_pd (__m256d a)在 Intel 之外的其他编译器上不可用,他们说它的性能在 AMD 处理器上有__m256d _mm256_log2_pd (__m256d a) 。 g++-4.8 中缺少 AVX 日志内在函数 (_mm256_log_ps) 中提到的互联网上的一些实现? 和 SSE 和 AVX 的 SIMD 数学库,但是它们似乎比 AVX2 更 SSE。 还有 Agner Fog 的 vector library ,但是它是一个大库,拥有更多的东西,只是 vector log2,所以从它的实现中很难找出 vector log2 操作的基本部分。 因此,有人可以解释一下如何有效地对4个double精度数的向量实现log2()操作吗? 即就像__m256d _mm256_log2_pd (__m256d a)所做的那样,但可用于其他编译器,并且对于 AMD 和 Intel 处理器都相当有效。 编辑:在我当前的特定情况下,数字是 0 和 1 之间的概率,对数用于熵计算:对P[i]*log(P[i])所有i求和的否定。 P[i]的浮点指数范围很大,所以数字可以接近 0。我不确定准确性,所以会考虑任何以 30 位尾数开始的解决方案,尤其是可调谐解决方案是首选. EDIT2:这是我到目前为止的实现,基于来自 https
  • Factor sympy expression to matrix coefficients?
    I have tried to be diligent in looking through documentation and am coming up empty. I am trying to factor or eliminate terms in a expression to matrix form. My problem appears to differ from polynomial factoring (as I plan to implement a function phi(x,y,z) = a_1 + a_2*x + a_3*y + a_4*z) import sympy from sympy import symbols, pprint from sympy.solvers import solve phi_1, phi_2, x, a_1, a_2, L = symbols("phi_1, phi_2, x, a_1, a_2, L") #Linear Interpolation function: phi(x) phi = a_1 + a_2*x #Solve for coefficients (a_1, a_2) with BC's: phi(x) @ x=0, x=L shape_coeffs = solve([Eq(phi_1, phi)
  • 将因子表达式表达为矩阵系数?(Factor sympy expression to matrix coefficients?)
    问题 我试图勤于阅读文档,而且空无一人。 我正在尝试分解或消除矩阵形式的表达式中的术语。 我的问题似乎与多项式因式分解不同(因为我计划实现函数phi(x,y,z) = a_1 + a_2*x + a_3*y + a_4*z ) import sympy from sympy import symbols, pprint from sympy.solvers import solve phi_1, phi_2, x, a_1, a_2, L = symbols("phi_1, phi_2, x, a_1, a_2, L") #Linear Interpolation function: phi(x) phi = a_1 + a_2*x #Solve for coefficients (a_1, a_2) with BC's: phi(x) @ x=0, x=L shape_coeffs = solve([Eq(phi_1, phi).subs({x:0}), Eq(phi_2, phi).subs({x:L})], (a_1, a_2)) pprint(shape_coeffs) #Substitute known coefficients phi = phi.subs(shape_coeffs) pprint(phi) 这可以按预期工作,但是,我想将其分解为矩阵形式,其中:
  • 如何在MATLAB中确定线性回归线的系数? [关闭](How do I determine the coefficients for a linear regression line in MATLAB? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 1年前关闭。 改善这个问题 我将要编写一个程序,其中输入是2D点的数据集,而输出是通过最小化最小MSE误差的最佳拟合线的回归系数。 我有一些要处理的样本点: X Y 1.00 1.00 2.00 2.00 3.00 1.30 4.00 3.75 5.00 2.25 我将如何在MATLAB中执行此操作? 具体来说,我需要获得以下公式: y = A + Bx + e A是截距, B是斜率,而e是每点的残留误差。 回答1 从您提供的链接以及我对问题的理解来看,您想要计算最适合一组数据点的线。 您还想从第一条原则开始。 这将需要一些基本的微积分以及一些线性代数来求解2 x 2的方程组。 如果您从线性回归理论中回想起,我们希望找到最佳斜率m并截取b ,以便对于一组点([x_1,y_1], [x_2,y_2], ..., [x_n,y_n]) (也就是说,我们有n数据点),我们希望最小化此线与数据点之间的残差平方和。 换句话说,我们希望最小化成本函数F(m,b,x,y) : m和b是这条最佳拟合线的斜率和截距,而x和y是形成我们的数据集的x和y坐标的向量。 该函数是凸的,因此我们可以确定一个最佳最小值。 可以通过找到每个参数的导数并将其设置为0来确定最小值
  • 算法中的常数因子和低阶项是什么?(What is constant factors and low-order term in algorithms?)
    问题 在以下视频中,对渐近分析进行了解释:https://class.coursera.org/algo-004/lecture/169 但是我不明白什么是“低阶术语”和“常数因子”本身? (在视频的第4分钟)。 合并排序为6n*log2(n)+6n 。 为什么在这里6n是低阶项,而6是constant factor呢? 这些术语有具体定义吗? 回答1 低阶字词: 这里的“顺序”是指数量级。 当处理非常简单的术语(例如x或x 2时,该概念易于理解和解释。 x具有1的数量级,因为它可以写为x 1 ,而x 2具有2的数量级-数量级等于该项中变量的幂。 但是,当您通过例如添加log使事情复杂化时,事情变得更加朦胧(至少对我而言)。 [1] 在有些方面非正式, f(x)是一个低阶比g(x)如果f(x) < g(x)为x趋向于无穷大。 很容易看到f(n) = 6n比g(n) = 6n*log2(n)一些,只不过是用了一个非常大的值代替n (正确的方法是用数学证明,但用大的n代替价值往往只适用于简单的术语)。 术语本质上是用加/减符号分隔的事物。 因此,低阶术语只是比其他术语低阶的任何术语。 大概这与前导术语相反,前导术语是数量级最大的术语。 [1]:我经常处理big-O,但是已经有一段时间了(高中吗?),因为我已经处理了数量级的基础知识,所以如果我可能错过或忘记了有关该部分的内容
  • poly()如何生成正交多项式? 如何理解返回的“珊瑚”?(How `poly()` generates orthogonal polynomials? How to understand the “coefs” returned?)
    问题 我对正交多项式的理解是它们采用以下形式 y(x)= a1 + a2(x-c1)+ a3(x-c2)(x-c3)+ a4(x-c4)(x-c5)(x-c6)...所需条款 其中a1 , a2等是每个正交项的系数(拟合之间的变化),而c1 , c2等是正交项内的系数,确定为使得各项保持正交性(使用相同的x值在拟合之间保持一致) 我知道poly()用于拟合正交多项式。 一个例子 x = c(1.160, 1.143, 1.126, 1.109, 1.079, 1.053, 1.040, 1.027, 1.015, 1.004, 0.994, 0.985, 0.977) # abscissae not equally spaced y = c(1.217395, 1.604360, 2.834947, 4.585687, 8.770932, 9.996260, 9.264800, 9.155079, 7.949278, 7.317690, 6.377519, 6.409620, 6.643426) # construct the orthogonal polynomial orth_poly <- poly(x, degree = 5) # fit y to orthogonal polynomial model <- lm(y ~ orth_poly) 我想同时提取系数a1 ,
  • 强制SymPy保持条款的顺序(Force SymPy to keep the order of terms)
    问题 我有以下代码: from sympy import * init_printing() x,y = symbols('x y') u = Function('u')(x,y) ux,uy,uxx,uxy,uyy = symbols("u_x u_y u_xx u_xy u_yy") mainEvaluation = uxx - 2*sin(x)*uxy - (cos(x) ** 2) * uyy - 2*ux + (2 - cos(x) + 2*sin(x) )*uy 并且当print(mainExpression)的输出是 -2*u_x + u_xx - 2*u_xy*sin(x) + u_y*(2*sin(x) - cos(x) + 2) - u_yy*cos(x)**2 问题是:我想要变量的原始顺序。 u_xx - 2*u_xy*sin(x) - u_yy*cos(x)**2 - 2*u_x + u_y*(2*sin(x) - cos(x) + 2) 所有这些都是在IPython Notebook中完成的。 有什么方法可以保持秩序? 回答1 可悲的是,SymPy无法跟踪输入顺序(请参阅我在对该问题的评论中链接的另一个问题)。 您可以定义自己的排序函数,以便根据需要对表达式进行排序,但是由于无法保存信息,因此无法完全按照输入的顺序对它们进行排序。 回答2
  • 蓝桥杯算法提高---多项式输出
    目录1 问题分析描述3 改进代码4 something about myself2之前代码1 问题分析描述一元n 次多项式可用如下的表达式表示: f(x)=a[n]xn+a[n-1]x(n-1)+…+a[1]x+a[0], a[n]!=0 其中,a[i]x^i称为i 次项, a[i]称为i 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:多项式中自变量为x,从左到右按照次数递减顺序给出多项式。多项式中只包含系数不为0 的项。如果多项式n 次项系数为正,则多项式开头不出现“+”号,如果多项式n 次项系数为负,则多项式以“-”号开头。对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于0 次的项,其系数的绝对值为1,则无需输出1)。如果x 的指数大于1,则接下来紧跟的指数部分的形式为“x^b”,其中b 为x 的指数;如果x 的指数为1,则接下来紧跟的指数部分形式为“x”;如果x 的指数为0,则仅需输出系数即可。多项式中,多项式的开头、结尾不含多余的空格。输入格式 输入共有2 行 第一行1 个整数,n,表示一元多项式的次数。 第二行有n+1 个整数,其中第i 个整数表示第n-i+1 次项的系数,每两个整数之间用空格隔开。 1 ≤ n ≤ 100
  • 数学建模之插值算法
    数学建模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,模拟产生一些新的但又比较靠谱的值来满足需求,这就是插值的作用。 一维插值问题 问题如下:已经有n+1个节点(xi,yi)(i=0,1,…n)其中xi互不相同,不妨假设a=x0<x1<…<xn=b,求任一插值点x*(!=xi)处的插值y* 插值法的定义: 插值方法主要有三种:分段插值,插值多项式、三角插值。 分段插值: 每几个点之间构造一个多项式,然后可以构造多个多项式,那么这样就可以产生多个多项式。这就是分段插值。 插值法原理: 我们有n+1个点,这n+1个点满足n+1个多项式,那么就可以产生n+1个方程,构造一个方程组。然后将这些方程的参数提取出来组成一个矩阵。 若A可逆,则A不等于0,则方程式有唯一解。 拉格朗日插值法: 在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。 两个点构成的拉格朗日多项式为: 三个点的拉格朗日多项式为: 四个点的拉格朗日多项式为: 拉格朗日多项式的问题: 龙格现象:插值多项式次数越高误差越小吗? 高次插值会产生龙格现象,即在两端处波动较大,产生明显的震荡。在不熟悉曲线运动趋势的前提下,不要轻易使用高次插值。 由以上可得,插值多项式次数高
  • Python:如何评估一个字符串函数?(Python: How to evaluate a function which is string?)
    问题 我从数据库中得到一些模型 f(t)=(2.128795454425367)+(208.54359721863273)*t+(26.098128487929266)*t^2+(3.34369909584111)*t^3+(-0.3450228278737971)*t^4+(-0.018630757967458885)*t^5+(0.0015029038553239819)*t^6; 其中一些作为字符串。 我需要为t in range(1, 13)评估此函数 现在我必须手动复制这些功能并运行它们 print [1.2381648958643592 + \ 153.55656654019816 * t +\ 22.99318731025164 * (t**2) +\ 11.060577906796075 * (t**3) +\ -1.3465054084767891 * (t**4) + \ 0.016926765998876842 * (t**5) +\ 0.001500086893490721 * (t**6) for t in range(1, 13)] 有没有更好的办法在python中做到这一点? 回答1 如果性能不是主要问题-如果您仅以12分来评估它,我怀疑不是-那么您可以利用方便的sympy库为您做很多工作。 例如: >>> import sympy >>> sympy
  • lm()中的poly():原始与正交之间的差异(poly() in lm(): difference between raw vs. orthogonal)
    问题 我有 library(ISLR) attach(Wage) # Polynomial Regression and Step Functions fit=lm(wage~poly(age,4),data=Wage) coef(summary(fit)) fit2=lm(wage~poly(age,4,raw=T),data=Wage) coef(summary(fit2)) plot(age, wage) lines(20:350, predict(fit, newdata = data.frame(age=20:350)), lwd=3, col="darkred") lines(20:350, predict(fit2, newdata = data.frame(age=20:350)), lwd=3, col="darkred") 预测线似乎相同,但是为什么系数如此不同? 如何在raw=T和raw=F解释它们。 我看到由poly(...,raw=T)产生的系数与poly(...,raw=T) ~age+I(age^2)+I(age^3)+I(age^4)的系数匹配。 如果我想使用系数“手动”获得预测(不使用predict()函数),我应该注意些什么? 我应该如何解释poly()正交多项式的系数。 回答1 默认情况下,使用raw = FALSE , poly(
  • R函数“ poly”的真正作用是什么?(What does the R function `poly` really do?)
    问题 我已经阅读了手册页?poly (我承认我没有完全理解),还阅读了《统计学习入门》一书中对该功能的描述。 我目前的理解是,对poly(horsepower, 2)的调用应等效于编写horsepower + I(horsepower^2) 。 但是,这似乎与以下代码的输出相矛盾: library(ISLR) summary(lm(mpg~poly(horsepower,2), data=Auto))$coef # Estimate Std. Error t value Pr(>|t|) #(Intercept) 23.44592 0.2209163 106.13030 2.752212e-289 #poly(horsepower, 2)1 -120.13774 4.3739206 -27.46683 4.169400e-93 #poly(horsepower, 2)2 44.08953 4.3739206 10.08009 2.196340e-21 summary(lm(mpg~horsepower+I(horsepower^2), data=Auto))$coef # Estimate Std. Error t value Pr(>|t|) #(Intercept) 56.900099702 1.8004268063 31.60367 1.740911e-109
  • Force SymPy to keep the order of terms
    I have the following code: from sympy import * init_printing() x,y = symbols('x y') u = Function('u')(x,y) ux,uy,uxx,uxy,uyy = symbols("u_x u_y u_xx u_xy u_yy") mainEvaluation = uxx - 2*sin(x)*uxy - (cos(x) ** 2) * uyy - 2*ux + (2 - cos(x) + 2*sin(x) )*uy And when the output of print(mainExpression) is -2*u_x + u_xx - 2*u_xy*sin(x) + u_y*(2*sin(x) - cos(x) + 2) - u_yy*cos(x)**2 The problem is: I want the original order of variables. u_xx - 2*u_xy*sin(x) - u_yy*cos(x)**2 - 2*u_x + u_y*(2*sin(x) - cos(x) + 2) All this is done in IPython notebook. Is there any way to keep order?
  • Enforce custom ordering on Sympy print
    SymPy does a wonderful work keeping track of all the operations I do to my symbolic expressions. But a the moment of printing the result for latex output I would like to enforce a certain ordering of the term. This is just for convention, and unfortunately that convention is not alphabetical on the symbol name(as reasonably sympy does) import sympy as sp sp.init_printing() U,tp, z, d = sp.symbols('U t_\perp z d') # do many operations with those symbols # the final expression is: z+tp**2+U+U/(z-3*tp)+d My problem is that SymPy presents the expression ordered as U + U/(-3*t_\perp + z) + d + t_
  • 3D曲线拟合(3D curvefitting)
    问题 我具有a,b点及其对应的c值的离散规则网格,并对其进行进一步插值以获得平滑曲线。 现在,从插值数据中,我还想创建一个用于曲线拟合的多项式方程。 如何在多项式中拟合3D图? 我尝试在MATLAB中执行此操作。 我在MATLAB(r2010a)中使用了曲面拟合工具箱来对3维数据进行曲线拟合。 但是,在MATLAB / MAPLE或任何其他软件中,如何找到最适合数据的公式。 有什么建议吗? 同样最有用的是一些实际的代码示例,例如PDF文件,网络等。 这只是我数据的一小部分。 a = [ 0.001 .. 0.011]; b = [1, .. 10]; c = [ -.304860225, .. .379710865]; 提前致谢。 回答1 要将曲线拟合到一组点上,我们可以使用普通的最小二乘回归。 MathWorks提供了一个解决方案页面,描述了该过程。 例如,让我们从一些随机数据开始: % some 3d points data = mvnrnd([0 0 0], [1 -0.5 0.8; -0.5 1.1 0; 0.8 0 1], 50); 如@BasSwinckels所示,通过构造所需的设计矩阵,可以使用mldivide或pinv求解表示为Ax=b的超定系统: % best-fit plane C = [data(:,1) data(:,2) ones(size(data,1)