Where communities thrive

  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
Repo info
  • 23:12
    meganly synchronize #21628
  • 23:07
    asmeurer commented #21945
  • 23:05
    asmeurer commented #21945
  • 23:00
    oscarbenjamin labeled #22074
  • 22:57
    oscarbenjamin commented #22129
  • 22:57
    oscarbenjamin labeled #22129
  • 22:46
    oscarbenjamin commented #22128
  • 22:28
    oscarbenjamin labeled #22073
  • 22:28
    oscarbenjamin closed #22073
  • 22:28
    oscarbenjamin commented #22073
  • 22:27
    oscarbenjamin labeled #22100
  • 22:26
    oscarbenjamin commented #22107
  • 22:24
    oscarbenjamin labeled #22107
  • 22:16
    oscarbenjamin commented #22124
  • 21:44

    oscarbenjamin on sympy-1.9rc1


  • 20:27
    meganly commented #21628
  • 19:48
    github-actions[bot] commented #22130
  • 18:48
    smichr synchronize #22130
  • 18:23
    sympy-bot commented #22130
  • 18:22
    smichr opened #22130
Miguel Guthridge
For the = I'm using sym.Eq(a, b)
And then once I've got everything simplified as much as possible, it uses sym.solve() with a list of the expressions
Which is where the error occurs
Ok nevermind it turns out that sympy doesn't work well with prettyprinting so I just had to stringify it first
Hey guys,
My name is Adarsh V. Desai. I am an aspiring software developer. I would like to be a part of sympy and take my skills to the next level by learning new technologies while being an active contributor. I have already installed sympy (developer version) on my local system. Could you guys please point me towards what I should do next to become an active contributor and also understand the code base?
Thank you.
You could help solving issues, prioritizing bugs: https://github.com/sympy/sympy/issues
Priyanshu Agarwal
When I try sympy.vector.operators.Divergence('x') it gives me AttributeError: module 'sympy' has no attribute 'vector' but when I try from sympy.vector.operators import Divergence and Divergence('x') it works, could you please help me
Aaron Meurer
The vector module is not imported by default so you have to import sympy.vector before you can access it.
I'm a bit confused with the Fr and Frstar outputs of Kane's method. Here I've printed them. Fr, shows Tx, which is the load/torque. Cool. Frstar has 3 terms. First one is Ixx ddeta; inertia x angular acceleration. ok. But the next 2 terms are Ixx Omega^2; inertia x angular velocity^2. why is it like that? Fr has the unit Nm, term 1 of Frstar has Nm.rad, others have Nm.rad^2. Is it because rad is an SI derived unit?
Gerardo Jose Suarez
Hi. why is xconjugate(x)==abs(x)*2 false?
Kalevi Suominen

They are not structurally equal:

In [11]: srepr(x*conjugate(x))                                                  
Out[11]: "Mul(Symbol('x'), conjugate(Symbol('x')))"

In [12]: srepr(abs(x)**2)                                                       
Out[12]: "Pow(Abs(Symbol('x')), Integer(2))"

== denotes structural equality.

Gerardo Jose Suarez
got it, is there other equality I can use for this kind of stuff?
Kalevi Suominen
You can use (abs(x)**2).rewrite(conjugate).
Sebastian Helm
Just a quick question|remark: Under The Power of Symbolic Computation, where output is spread over several lines, it misaligns with most fonts. Which font is recommended for viewing this nicely? I only found it to work with Unifont, which isn't very pretty, though. Anyway, maybe the page can be rewritten to suggest such a font?
4 replies
Pieter Barendrecht

Hi guys, question about root finding with symbolic coefficients. Is it possible to get symbolic results for something like the following:

import sympy as sp
t = sp.Symbol('t')
P = sp.Poly(t**2 + 2*t + sp.log(2))

This does not work, as I get sympy.polys.polyerrors.PolynomialError: only univariate polynomials are allowed

Replacing the 3rd line with P = sp.Poly(t**2 + 2*t + sp.log(2), t, domain='RR') works for numerical values. Looking at the docs, I thought something like P = sp.Poly(t**2 + 2*t + sp.log(2), t, domain='QQ<log(2)>') might work, but this triggers a sympy.polys.polyerrors.NotAlgebraic: log(2) doesn't seem to be an algebraic element
Kalevi Suominen
QQ<log(2)> does not work because log(2) is not algebraic. One must use something like QQ(log(2))instead. Or, simply give t as the sole generator; then log(2) will automatically become a constant.
In [26]: p = Poly(t**2 + 2*t + log(2), t)                                       

In [27]: roots(p)                                                               
⎧       ____________            ____________   ⎫
⎨-1 - ╲╱ 1 - log(2) : 1, -1 + ╲╱ 1 - log(2) : 1⎬
⎩                                              ⎭
Pieter Barendrecht
Thanks! Using P.all_roots() still produces an error when doing so (NotImplementedError: sorted roots not supported over ZZ[log(2)]), but roots(P) works just fine
Kunal Mahatha
Hey everyone,
I am Kunal. I want to contribute to sympy, but I am a beginner and I know basic to intermediate Python. Could someone please guide me on how the contribution procedure works here, and suggest to me some good beginner-friendly issues to start working on?
hi, i'm an amateur at logic, and was wondering if it was possible to generate latex semantic tableaux trees using sympy?
Joao Aguirre
Hello everyone, just a simple question (I hope), is it possible to do nested summations with dependent indexes using the Concrete class Sum, replicating in a "single command" things like
f(x)=i=03(j=i+14axiyj) f \left ( {x} \right ) = \sum_{i = 0}^{3} {\left ( {\sum_{j = i + 1}^{4} {\frac{a}{x_{i} - y_{j}}}} \right )}
1 reply
Brandon Feder
Hey guys. I was just wondering if anyone knows what algorithm is being used in the GeneralSumOfSquaresclass used here. Is there a paper I can reference/explanation, etc?
Aaron Meurer
@brandon-feder there are some links in the source, e.g., in the power_representation function. Otherwise you might find some references in some of the old 2013 posts in this blog https://thilinaatsympy.wordpress.com/
Jason Ross

I'm having trouble learning the diffgeom module. I'm trying to compute covariant derivatives in spherical coordinates and I feel like I'm missing something.

Here's what I'm working with:

from sympy import *
from sympy.abc import x, y, z, r, theta, phi
from sympy.diffgeom import CoordSystem, Manifold, Patch, TensorProduct as TP

R3 = Manifold("R3", 3)
S = Patch("S", R3)
relations = {
    ("Car3D", "Sph") : Lambda(
        (x, y, z),
            sqrt(x**2 + y**2 + z**2), 
            acos(z / sqrt(x**2 + y**2 + z**2)),
            atan2(y, x),
    ("Sph", "Car3D"): Lambda(
        (r, theta, phi),
        Matrix([r * sin(theta) * cos(phi), r * sin(theta) * sin(phi), r * cos(theta)])
Car3D = CoordSystem("Car3D", S, [x, y, z], relations)
Sph = CoordSystem("Sph", S, [r, theta, phi], relations)

I can compute the metric tensor in spherical coordinates by doing the following:

g = (Car3D.jacobian(Sph) @ Car3D.jacobian(Sph).T).simplify()

However, this computes the metric tensor with respect to $x, y, z$, while I'd like to write the metric tensor with respect to $r, \theta, \phi$:
[10001x2+y2+z20001x2+y2]\left[\begin{matrix}1 & 0 & 0\\0 & \frac{1}{x^{2} + y^{2} + z^{2}} & 0\\0 & 0 & \frac{1}{x^{2} + y^{2}}\end{matrix}\right]
I can do a substitution, but it's kind of awkward:

x, y, z = Car3D.symbols
r, theta, phi = Sph.symbols
forward_subs = {
    x: r * sin(theta) * cos(phi),
    y: r * sin(theta) * sin(phi),
    z: r * cos(theta)
g_sph = g.subs(forward_subs).simplify()

[10001r20001r2sin2(θ)]\left[\begin{matrix}1 & 0 & 0\\0 & \frac{1}{r^{2}} & 0\\0 & 0 & \frac{1}{r^{2} \sin^{2}{\left(\theta \right)}}\end{matrix}\right]
This gives me the expected metric tensor as a matrix but there's a lot of extra effort:

  • I have to define the forward and backward transformations BEFORE I declare forward_subs since the CoordinateSymbol "x" does not exist until I create Car3D, and I have to provide the forward and backward transformations to create Car3D.
  • Converting from one coordinate system to another uses a dictionary that duplicates all the information already defined in the coordinate systems
  • Computing a metric tensor by taking the Jacobian times its transpose seems like extra effort
  • I still haven't got a tensor expression for the metric tensor

I can convert the metric tensor Matrix to a tensor expression as follows:

g_sph_tens = 0
for i, e_i in enumerate(Car3D.base_oneforms()):
    for j, e_j in enumerate(Car3D.base_oneforms()):
        g_sph_tens += g_sph[i, j] * TP(e_i, e_j)

However, computing the Christoffel symbol for g_sph_tens using metric_to_Christoffel_2nd gives all zeros, which is incorrect.

Can somebody help me out with this? It seems like I'm missing some fundamentals.

1 reply
Matías Senger

Hi, I want to learn SymPy to do some calculations. I am practicing with the electromagnetic Lagrangian term $F_{\mu\nu}F^{\mu\nu}$. I have defined $F$ in the way that is explained in the documentation but cannot figure out how to go from there to $E^2 + B^2$. How am I supposed to do this?

Up to now I have this:

Ex, Ey, Ez, Bx, By, Bz = sp.symbols('E_x E_y E_z B_x B_y B_z')
c = sp.symbols('c', positive=True)

F = spT.TensorHead('F', [Lorentz, Lorentz], spT.TensorSymmetry.fully_symmetric(-2))

repl = {Lorentz: sp.diag(1, -1, -1, -1)}
repl.update({F(-mu,-nu): [
    [0, Ex/c, Ey/c, Ez/c],
    [-Ex/c, 0, -Bz, By],
    [-Ey/c, Bz, 0, -Bx],
    [-Ez/c, -By, Bx, 0]]}

and I have tried (F(mu,nu)*F(-mu,-nu)).replace_with_arrays(repl, [mu,nu]) and also F(mu,nu).replace_with_arrays(repl, [mu,nu])*F(-mu,-nu).replace_with_arrays(repl, [mu,nu]).

6 replies
Priyanshu Agarwal
Hey, I have some huge equations but they are getting printed incomplete and half when I use sympy preview for pdf (see the pdf here) , could you please help me with this
sympy.preview(expr, output="pdf", viewer="file", filename="DFN_equations.pdf", dvioptions=['-D', '1100'], euler=False)
Jason Ross

I wanted to expand on my question from earlier since it may be too specific.
I am working through some equations from the theory of elasticity.

The differential equation I am trying to work with is the equation
for compatibility of small displacements in a strained isotropic elastic body.
This is written as
(12η)vijj+vjji=0(1 - 2\eta) v^i|^j_j + v^j|^i_j = 0
represents the covariant derivative of f with respect to j, and
represents the covariant derivative of f with respect to j
with the j index raised (this convention is from Green and Zerna -
I don't know if this is a standard notation).

We can use solutions of the above differential equation to compute
the stress tensor as follows:

τijμ=gjsvis+girvjr+2η12ηgijvrr\frac{\tau^{ij}}{\mu} = g^{js} v^i|_s + g^{ir} v^j|_r + \frac{2 \eta}{1 - 2 \eta} g^{ij} v^r|_r

One of the solutions to the displacement equation is as follows:

vi=Fiv_i = F|_i

where F is a harmonic function.

What's a good way to

  1. Verify that this satisfies the displacement equation
  2. Plug this into the stress tensor equation and display the result in Cartesian
    and spherical coordinates?
Megan Ly
Is there a way to get Sympy to pull a constant inside of an integral without evaluating it? For example, rewriting c*Integral(f(x), (x,a,b)) as Integral(c*f(x), (x,a,b)). I'm struggling to get replace to work.
4 replies
Hello everyone!
Am Ruturaj, computer science student.
I want to contribute to this open source, so can anyone guide me please?
Cherish Sachdeva
Hello Everyone!
Hope you all are having a nice day.I want to integrate(cos(3theta)/(5-4cos(theta)),(theta,0,2pi)) this expression whose
answer is pi/12 but sympy does not executes the integral. So,I replaced cos(3
theta) with
4cos(theta)*3-3cos(theta) then I am obtaining -21pi/8.Also when I replaced cos(3theta) with
cos(theta) sympy executed the integral and gave -pi/2.Can anyone please elaborate why sympy is not executing
cos(3*theta) in integral?
Kalevi Suominen
Integrals of that type should be handled by the risch integrator but that part of the algorithm has not been implemented (yet). Currently, heurisch will be used as a fall-back integrator but it looks like there is a bug that leads to a wrong result.
Megan Ly
Is there a way to get the Latex printer to print Integral(x**2,(x,1,2)) as the string '\\int_{1}^{2} x^{2}\\, dx' instead of '\\int\\limits_{1}^{2} x^{2}\\, dx'?
Aaron Meurer
@meganly apparently latex(mode='inline') does that.
I wonder what the point of \limits is.
12x2dx\int_1^2 x^2\, dx vs. 12x2dx\int\limits_1^2 x^2\, dx
I guess \limits puts them directly above or below the integral sign. That does seem better for non-inline mode, especially if the limits can be long.
then again the non-limits version does look better even for equation mode when the limits are small. Maybe there should be some heuristics here.
Aaron Meurer
I opened sympy/sympy#21851 for this.
Megan Ly
Thanks. My reason for not wanting \limits is that the \limits command is not supported by MathQuill which causes issues for rendering Latex in a web browser.
hey hey, I saw in the release notes that ArraySymbol was added, however, I couldn't find the documentation on it, does anyone have any hints where to find more information?
Aaron Meurer
It looks like it isn't documented very much yet. You may have to take a look at the PR that added it for now to get some more information.
Thanks, I looked into the source and it basically is a way to conveniently get symbols with labes that make sense for arrays and array elements, but there is not other functionality that really requires documentation
Aaron Meurer
I think it should be roughly the same idea as MatrixSymbol
Any docs to build sympy from source?
2 replies
Lambdify uses _EvaluatorPrinter and I want it to behave slightly differently. Is there any option other than a lot of code duplication/modifying the source? Specifically, I don't want it to use return, but instead I want to use ASTs return (so that I can e.g. go for multiple lines in one go or use control flow logic from AST)
In particular, my solution would be to replace '''funcbody.append('return ({})'.format(self._exprrepr(expr)))''' with '''funcbody+=self._exprrepr(expr).splitlines()''' if expr is a CodeBlock on line 1092 of utilities/lambdify.py
also, gratz on the 1.9 release :D