天道酬勤,学无止境

computer-algebra-systems

在传递给 sum() 之前强制评估索引表达式(Force evaluate index expression before passing to sum())

问题 我想编写一个(以某种方式)增强的 sum 函数,它一次需要多个索引,但我无法理解如何让它工作。 这是我目前拥有的: (%i1) nsum(indexes, expr) := if indexes = [] then expr else nsum(rest(indexes), sum(expr, first(indexes),1, N)) $ (%i2) nsum([i,j], i+j), nouns; sum: index must be a symbol; found intosym(first(indexes)) #0: nsum(indexes=[k,j],expr=k+j) 我认为这可以通过在传递给sum函数之前强制 Maxima first(indexes)扩展first(indexes)为符号来解决。 我试过''(...)和ev(..., nouns) ,但没有任何成功。 回答1 经过一些阅读和尝试后,我得出了以下解决方案,该解决方案使用apply函数来预评估sum参数: nsum(indexes, expr) := if indexes = [] then expr else nsum(rest(indexes), apply(sum, ['expr, indexes[1], 1, N])) $ UPD1: 不幸的是,上面的代码有问题

2021-09-23 09:43:33    分类:技术分享    symbolic-math   quote   maxima   computer-algebra-systems

Force evaluate index expression before passing to sum()

I want to write an (somehow) enhanced sum function which takes a number of indices at once, but I cannot understand how to get it work. Here is what I currently have: (%i1) nsum(indexes, expr) := if indexes = [] then expr else nsum(rest(indexes), sum(expr, first(indexes),1, N)) $ (%i2) nsum([i,j], i+j), nouns; sum: index must be a symbol; found intosym(first(indexes)) #0: nsum(indexes=[k,j],expr=k+j) I think this could be fixed by forcing Maxima expand first(indexes) into a symbol before passing to sum function. I tried ''(...) and ev(..., nouns), but without any success.

2021-09-03 18:48:01    分类:问答    symbolic-math   quote   maxima   computer-algebra-systems

Sympy:删除多项式中的高阶项(Sympy: Drop higher order terms in polynomial)

问题 使用 Sympy,假设我们有一个表达式 f,它是符号“x”(可能还有其他符号)的多项式。 我想知道是否有一种有效的方法可以删除大于某个整数 n 的 f 阶中的所有项。 作为一种特殊情况,我有一个非常复杂的函数,但我只想将项保持在 x 中的二阶。 这样做的有效方法是什么? 显而易见的,不是非常有效的方法是对于每个小于 n 的 m,取 m 个导数并将 x 设置为 0 以获得 x^m 的系数。 我们以这种方式获得每个系数,然后重建多项式。 但采取衍生品并不是最有效的方式。 回答1 一种简单的方法是将O(x**n)到表达式中,例如 In [23]: x + x**2 + x**4 + x**10 + O(x**3) Out[23]: 2 ⎛ 3⎞ x + x + O⎝x ⎠ 如果您想稍后删除它,请使用removeO方法 In [24]: (x + x**2 + x**4 + x**10 + O(x**3)).removeO() Out[24]: 2 x + x 您还可以使用series对表达式进行级数扩展。 这里的区别在于如果非多项式项出现在表达式中时的行为: In [25]: x + sin(x) + O(x**3) Out[25]: ⎛ 3⎞ sin(x) + x + O⎝x ⎠ In [26]: (x + sin(x)).series(x, 0, 3) Out[26]: ⎛ 3

2021-09-01 07:25:23    分类:技术分享    python   sympy   symbolic-math   computer-algebra-systems   polynomials

像 SymPy 这样的 Haskell 库? [关闭](Haskell library like SymPy? [closed])

问题 关闭。 此问题不符合 Stack Overflow 准则。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 6年前关闭。 改进这个问题 我需要操作像 1 + sqrt(3) 这样的表达式并做基本的算术,比如加法、减法和除法。 我希望结果采用某种规范形式,以便它可以用作地图中的键。 由于舍入问题,将 1 + sqrt(3) 转换为浮点数是不可行的。 我在 Python 中使用 SymPy 来完成这个任务。 Haskell 是否有等效的本机库? 回答1 请查看号码包。 如果您只需要存储像“1 + √3”这样的精确数字,您可能需要使用 Data.Number.CReal 而不是符号算术。 它存储表达式,并可以在需要时计算为任意数量的数字。 Prelude Data.Number.CReal> let cx = 1 + sqrt (3 :: CReal) Prelude Data.Number.CReal> showCReal 400 cx "2

2021-06-22 21:12:37    分类:技术分享    haskell   symbolic-math   computer-algebra-systems

Equations Equality test (in C++ or with Unix tools) (algebra functions isomorphism) [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers. Want to improve this question? Update the question so it's on-topic for Stack Overflow. Closed 5 years ago. Improve this question I am looking for C++ open-source library (or just open-source Unix tool) to do: Equality test on Equations . Equations can be build during runtime as AST Trees, string or other format. Equations will mostly be simple algebra ones, with some assumptions about unknown functions. Domain, will be integer arithmetic (no floating point issues, as related issues are well

2021-06-15 10:16:21    分类:问答    c++   math   open-source   discrete-mathematics   computer-algebra-systems

Symbolic Math Library in C/C++/Obj-C [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers. Want to improve this question? Update the question so it's on-topic for Stack Overflow. Closed 4 years ago. Improve this question I am trying to implement a graphing calculator on the iPhone. I am looking for a library that can take strings of expressions or functions and let me manipulate them (find derivatives, intercepts, zeros, etc). Does anything like this exist?

2021-06-10 20:48:25    分类:问答    c++   objective-c   c   symbolic-math   computer-algebra-systems

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

2021-06-05 02:31:58    分类:问答    python   sympy   symbolic-math   computer-algebra-systems   polynomials

如何在 Sympy 中进行函数组合?(How to do function composition in Sympy?)

问题 我想做类似h = f(g(x))事情,并能够区分h,例如h.diff(x) 。 对于像h = cos(x)这样的一个函数,这实际上是可能的,并且文档清楚地说明了这一点。 但是对于函数组合,就不是那么清楚了。 如果你已经这样做了,请给我看一个例子或将我链接到相关文档。 (如果 Sympy 无法做到这一点,您是否知道其他任何可以做到这一点的软件包,即使它是非 Python 的) 谢谢你。 回答1 在 sympy 中,函数组合似乎像您期望的那样工作: import sympy h = sympy.cos('x') g = sympy.sin(h) g Out[245]: sin(cos(x)) 或者如果你喜欢 from sympy.abc import x,y g = sympy.sin('y') f = g.subs({'y':h}) 然后你可以调用 diff 来获取你的导数。 g.diff() Out[246]: -sin(x)*cos(cos(x))

2021-06-01 15:54:38    分类:技术分享    python   sympy   computer-algebra-systems

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

2021-05-25 02:59:34    分类:技术分享    python   sympy   computer-algebra-systems   symbolic-computation

处理Sympy积分返回的分段方程(Dealing with piecewise equations returned by sympy integrate)

问题 在sympy中,我有一个返回逐段对象的积分,例如 In [2]: from sympy.abc import x,y,z In [3]: test = exp(-x**2/z**2) In [4]: itest = integrate(test,(x,0,oo)) In [5]: itest Out[5]: ⎧ ___ ⎪ ╲╱ π ⋅z │ ⎛ 1 ⎞│ π ⎪ ─────── for │periodic_argument⎜──────────────, ∞⎟│ ≤ ─ ⎪ 2 │ ⎜ 2 ⎟│ 2 ⎪ │ ⎝polar_lift (z) ⎠│ ⎪ ⎪∞ ⎪⌠ ⎨⎮ 2 ⎪⎮ -x ⎪⎮ ─── ⎪⎮ 2 ⎪⎮ z ⎪⎮ ℯ dx otherwise ⎪⌡ ⎪0 ⎩ 我只想提取该分段方程式的第一个分支,换句话说,我希望能够执行类似itest.parts(0)来简单提取sqrt(pi)*z/2 。 我似乎找不到任何方法可以执行此操作,但是也许我在文档中使用了错误的搜索词。 有任何想法吗? 编辑 itest.args[0][0]一下,我设法找到了如果执行itest.args[0][0] ,则可以提取此表达式。 但是,这似乎有点骇人听闻。 有没有更好的方法? 回答1 通常,使用.args是访问表达式各部分的正确方法。 不过,在这种情况下

2021-05-18 06:59:43    分类:技术分享    python   sympy   symbolic-math   computer-algebra-systems   symbolic-computation