如何从符号表达式中创建函数?例如,我有以下内容:
syms beta
n1,n2,m,aa= Constants
u = sqrt(n2-beta^2);
w = sqrt(beta^2-n1);
a = tan(u)/w+tanh(w)/u;
b = tanh(u)/w;
f = (a+b)*cos(aa*u+m*pi)+a-b*sin(aa*u+m*pi); %# The main expression
Run Code Online (Sandbox Code Playgroud)
如果我想f在特殊程序中使用它来查找它的零,我该如何转换f为函数?或者,我该怎么做才能找到f这些嵌套表达式的零?
在尝试解决符号数学问题后,我得到了一个大约17000个字符的表达式.我正在使用Matlab的符号工具箱,但我对任何建议(Mathematica,无论如何)都持开放态度.
出于显而易见的原因,我不会将表达式直接复制粘贴到问题中.这是一个链接.
运行Matlab命令simplify和simple,甚至企图collect没有改善的情况(有些我们更糟糕).
但我想知道,我不关心是否使用时间参数逐步评估表达式.就像是:
z1 = a^2*y1;
%Now the expression can be simplified by using z1 as alias!
z1+z1^2 ....
Run Code Online (Sandbox Code Playgroud)
是否有一种自动方法可以通过时间变量逐步简化这种方法?此外,您可以想到的任何其他方法都是合理的.
我正在做一个非常简单的概率计算,即从AZ集(具有相应的概率x,y,z)中获取X,Y,Z的子集。
而且由于非常沉重的公式,以处理它们,我想简化(或收集或因子使用这些多项式-我不知道确切的定义)sympy。
因此..(具有从具有对应概率x,y,z的AZ集合中获得X,Y,Z子集的非常简单的概率计算表达式)
import sympy as sp
x, y, z = sp.symbols('x y z')
expression = (
x * (1 - x) * y * (1 - x - y) * z +
x * (1 - x) * z * (1 - x - z) * y +
y * (1 - y) * x * (1 - y - x) * z +
y * (1 - y) * z …Run Code Online (Sandbox Code Playgroud) 从我的SymPy输出我有下面显示的矩阵,我必须在2D中集成.目前我正在以元素方式进行,如下所示.此方法适用,但它变得太慢(用于sympy.mpmath.quad和scipy.integrate.dblquad)为我的真实案例(其中A,其职能是更大(见下面编辑):
from sympy import Matrix, sin, cos
import sympy
import scipy
sympy.var( 'x, t' )
A = Matrix([[(sin(2-0.1*x)*sin(t)*x+cos(2-0.1*x)*cos(t)*x)*cos(3-0.1*x)*cos(t)],
[(cos(2-0.1*x)*sin(t)*x+sin(2-0.1*x)*cos(t)*x)*sin(3-0.1*x)*cos(t)],
[(cos(2-0.1*x)*sin(t)*x+cos(2-0.1*x)*sin(t)*x)*sin(3-0.1*x)*sin(t)]])
# integration intervals
x1,x2,t1,t2 = (30, 75, 0, 2*scipy.pi)
# element-wise integration
from sympy.utilities import lambdify
from sympy.mpmath import quad
from scipy.integrate import dblquad
A_int1 = scipy.zeros( A.shape, dtype=float )
A_int2 = scipy.zeros( A.shape, dtype=float )
for (i,j), expr in scipy.ndenumerate(A):
tmp = lambdify( (x,t), expr, 'math' )
A_int1[i,j] = quad( tmp, (x1, x2), …Run Code Online (Sandbox Code Playgroud) 我一直在试图计算只有三个不同的项目,组成一个36分36矩阵的Jordan标准型1,1/2和0.矩阵是概率转移矩阵,因此,给定这些条目,矩阵显然是稀疏的.
我一直遇到的问题如下:每当我尝试计算时
[V, J] = jordan(A),
Run Code Online (Sandbox Code Playgroud)
要么
[V, J] = jordan(sym(A)),
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
在MuPAD命令中使用mupadmex 错误时出错:相似度矩阵太大.sym/mupadmexnout出错(第1546行)
out = mupadmex(fcn,args {:});sym/jordan中的错误(第32行)
[Vsym,Jsym] = mupadmexnout('symobj :: jordan',A,'All');
我在MATLAB帮助中读到,Jordan形式的计算对扰动非常敏感.但是,我认为我的计算不是问题,因为矩阵的所有条目都是整数或整数比.
我的问题如下:
matlab matrix linear-algebra symbolic-math numerical-stability
使用Sympy,假设我们有一个表达式f,它是符号"x"(以及可能的其他符号)的多项式.
我想知道如果有一种有效的方法可以删除大于某个整数n的f中的所有项.
作为一个特例,我有一个非常复杂的功能,但我想只保留x中的第二个订单.有效的方法是什么?
这种明显的,非常有效的方法是每m小于n,取m个导数并将x设为0,得到x ^ m的系数.我们以这种方式获得每个系数,然后重建多项式.但是采取衍生品并不是最有效的方法.
python symbolic-math sympy computer-algebra-systems polynomials
我希望用Java计算限制(微积分).我有以下Limit可以计算限制的类:
package calculus;
public final class Limit {
private Limit() {
}
public static final double limit(Function function, double approach) {
double below = Limit.limitFromBelow(function, approach);
double above = Limit.limitFromAbove(function, approach);
return below == above ? below : Double.NaN;
}
public static final double limitFromBelow(Function function, double approach) {
for (double d = approach - 10; d <= approach; d = approach
- ((approach - d) / 10)) {
if (function.apply(d) == Double.POSITIVE_INFINITY) {
return Double.POSITIVE_INFINITY;
} else …Run Code Online (Sandbox Code Playgroud) 我们知道1+2+...+n等于n(n+1)/2.
但是如果我们事先不知道它,我们可以以编程方式获得相同的结果吗?
关于为什么我有这样的问题.
想想更复杂的情况:
X1 + X2 + ... + Xk = n,其中Xi是整数且> = 0.
什么是期望X1^2+...Xk^2?
结果并不明显只是一目了然,一旦我们弄清楚期望的(详细的)数学表示,我们就会想要将它提供给程序来减少代数. X1^2+...Xk^2
当您第一次调用vpa(来自Octave的符号包)时,Octave会在输出实际结果之前在屏幕上生成一些文本.例如:
>> x = pretty(vpa('sqrt(-1)'))
OctSymPy v2.2.4: this is free software without warranty, see source.
Initializing communication with SymPy using a popen2() pipe.
Detected Windows: using "winwrapy.bat" to workaround Octave bug #43036
Some output from the Python subprocess (pid 6680) might appear next.
OctSymPy: Communication established. SymPy v0.7.6.1.
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)]
x = 1.0*I
Run Code Online (Sandbox Code Playgroud)
请注意,实际输出(变量x)是字符串'1.0*I',如预期的那样.其余部分不是函数输出的一部分,而是直接在屏幕上生成的文本.
该文本不会出现在后续调用中vpa,仅在启动Octave后第一次出现.它似乎并没有特别相关vpa,而是Octave与Python通信以处理符号计算的方式.
有没有办法避免显示该文本?或者失败了,有没有办法暂时 …
我有一些大小合适的矩阵(2000*2000),我希望在矩阵的元素中有符号表达式 - 即元素的.9**b + .8**b + .7**b ...一个例子.矩阵非常稀疏.
我通过添加中间计算来创建这些矩阵.我想将它们存储到磁盘中以便稍后读取并使用不同的值进行评估b.
我已经玩过同情,它确实完成了我需要它做的事情,但是做简单的添加是令人头脑麻木的慢.从我所看到的,似乎theano或tensorflow可能能够用Tensors做到这一点,但我无法弄清楚如何在Tensor中放置一个符号.
任何人都可以指出我正确的方向,使用这个任务的最佳工具?我更喜欢它在python中,但是如果python以外的东西能做到这一点也很好.
symbolic-math ×10
python ×5
matlab ×4
sympy ×4
algebra ×2
algorithm ×1
calculus ×1
expression ×1
java ×1
maple ×1
math ×1
matrix ×1
octave ×1
polynomials ×1
scipy ×1