Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to fill an empty Sympy Piecewise function?

I have a function called ‘symbolic_a0(array, T)’ and the objective of that function is to create a piecewise function from the array that is given. The way that the function works is the following:

  1. Create the symbols.
  2. Create an empty Piecewise function.
  3. Iterate the array and fill the empty piecewise function.
  4. In this case do a symbolic integration of the piecewise function.

But when I try to run the code, the line "piecewise_expr = smp.Piecewise()" gives me the next error:
At least one (expr, cond) pair expected.

import numpy as np
import sympy as smp

def symbolic_a0(array, T):
  t = smp.symbols('t', real=True)
  piecewise_expr = smp.Piecewise() # Create an empty piecewise function.

  # Build the Piecewise function from the array
  for segment in array:
    equation_lambda_numpy = lambda t: eval(segment["equation"].get()) # Lambda function with numpy expressions
    equation_sympy = smp.sympify(equation_lambda_numpy(t))
    lower_bound = int(segment["lower_bound"].get())
    upper_bound = int(segment["upper_bound"].get())
    piecewise_expr += (equation_sympy, (t, lower_bound, upper_bound))

  return smp.integrate(piecewise_expr, (t, 0, T))

The array that is given:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

piecewise_data = [
    {"equation": 0, "lower_bound": -2, "upper_bound": -1},
    {"equation": 1, "lower_bound": -1, "upper_bound": 1},
    {"equation": 0, "lower_bound": 1, "upper_bound": 2},
]

How do I get rid of this error?

The things that I already tried:

  1. piecewise_expr = smp.Piecewise(None, None).
  2. Giving it a dummy function, but I don’t want to use it in my calculation.

>Solution :

Make a list of arguments for the Piecewise and create the Piecewise when you are done:

import numpy as np
import sympy as smp

def symbolic_a0(array, T):
  t = smp.symbols('t', real=True)
  r = lambda t, lo, hi: (t>lo) & (t < hi) 
  piecewise_args = []

  # Build the Piecewise function from the array
  for segment in array:
    equation_lambda_numpy = lambda t: eval(segment["equation"].get()) # Lambda function with numpy expressions
    equation_sympy = smp.sympify(equation_lambda_numpy(t))
    lower_bound = int(segment["lower_bound"].get())
    upper_bound = int(segment["upper_bound"].get())
    piecewise_args.append((equation_sympy, r(t, lower_bound, upper_bound)))

  return smp.integrate(Piecewise(*piecewise_args), (t, 0, T))

Note use of r to create relational from the symbols and bounds. Piecewise args are (expr, condition) tuples.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading