Hi Brett,

On Thu, Jun 11, 2015 at 12:26 PM, Brett Smith <[email protected]> wrote:
> Hello All,
> New to the forum, but I have used Sympy on a few projects in the past.
> I am currently enrolled in a machine design course, and often times we have
> to solve large systems of equations.
> I do not really like how any of the solver we use in class work, so I
> thought I'd right my own.
> If it works well enough Id like to add a GUI front end and incorporate
> commonly used engineering functions.
> I have had success compiling systems of linear equations up to about 40
> equations & 40 unknowns.
> However adding any non-linear equations seems to break its back...

Can you post the file P5-9-FOS.txt, so that we can run solver.py?

Is anything else needed to run it?

What kind of equations are those? It seems these are numerical
equations, but they are non linear, is that right? What solvers do you
use in class?

Ondrej

>
> I was wondering if anybody here had a better way of going about this
> project.
> Right now it just reads a text file full of equations, parses the strings
> into sympy Functions, and then runs sympy.solve, and prints the solution to
> a new file.
>
> So currently operations looks like:
>
> import solver
> eqn = [] #holds all functions in file
> symb = [] #holds unique symbols
> sln = []  #holds all solution sets
> og  = [] #holds original, unparsed functions for printing to output file
> in_file = "problem_file.txt"
> out_file = "solution_file.txt"
>
> eqn , og = solver.parse_input(in_file)
> symb = solver.sort_symbols(eqn)
> sln = solver.solver(eqn)
> print_output(out_file,sln,og)
>
> Ill post the code below for easy reading, but I'll also attach a few demo
> files.
> Any ideas on how to make this more powerful (i.e. more equations, or more
> non-linear equations)???
> Running this in my sublime editor a couple times also slows my whole system
> WAY down from time to time (Ubuntu 14.04)
> Thanks Gang!!
>
>
>
> from sympy import *
> from sympy.parsing.sympy_parser import parse_expr
> from IPython.display import display_pretty
> import string
> import time
> import os
>
> init_printing(use_latex = True)
>
> #Vars
> sig_figs = 6
>
>
> def sort_symbols(_functions): #Returns unique Sympy sybols from array of
> functions
> _symbols  = []
> temp = []
> symbol_str = []
> symbols_sorted = []
>
> for i in _functions:
> _symbols.append(i.atoms(Symbol))
>
> for i in _symbols: #Puts all occurences of all symbols in 1 list
> temp += (set.union(i))
>
> temp = list(set(temp))         #Eliminate duplicates
>
> for i in temp: #Convert to string so symbols may be sorted
>    symbol_str.append(str(i))
>
> symbol_str = sorted(symbol_str)
>
> for i in symbol_str:   #Convert string back to sympy symbols
> symbols_sorted.append(parse_expr(i))
>
> return symbols_sorted
>
> def parse_input(_file): #Converts file into array of Sympy Functions
> _functions = []
> original_functions = []
> lines = []
> with open(_file,'r+') as f:
> lines = f.readlines()
> for line in lines:
> line = line[:-1]
> comment = line[0] == '#'
> if not comment:
> if "#" in line: #remove comments
> split = string.find(line,"#")
> line = line[0:split]
>
> original_functions.append(line) #Store original syntax
>
> line = string.replace(line," ","") #remove white space
> line = string.replace(line," ","")
>
> if "^" in line: #Convert conventional equation syntax in sympy syntax
> line = string.replace(line,"^","**")
>
> if "=" in line:
> split = string.find(line,'=')
> line = "Eq(" + line[0:split] + "," + line[split + 1:len(line)] + ")"
> temp = parse_expr(line)
> _functions.append(temp)
> return _functions, original_functions
>
>
> def solver(_functions):
> _solution = solve(_functions[0:len(_functions)],manual=True)     #Pass
> functions to solver #,symbols[0:len(symbols)] #passes symbols
> print _solution
> return _solution
>
> def print_output(_solutions):
>
> print "The submitted functions:"
> for i in original_functions:
> pretty_print(i)
>
> print "Have the following unique variables"
> for i in sort_symbols():
> pretty_print(i)
>
> print "And have solutions set(s):"
> for i in _solutions:
> for u in i:
> print str(u) + " = " + str(Float(i[u],sig_figs))
>
> def print_to_file(f,_solutions,_functions):
> ##Print File Header
> _file = open(f,'w+')
> header = "Brett's Sympy Solver!\nSolution Created : " +
> time.strftime("%d/%m/%Y") + "\n"
> _file.write(header)
> header = "Equation File : " + os.getcwd() + "/" + in_file + "\n\n"
> _file.write(header)
>
> ##Some nice underscoring
> max_length = 0
>
> for i in _solutions:
> for u in i:
> length = len(str(Float(i[u],sig_figs))+" = "+ str(u)) #find longest equation
> if length > max_length:
> max_length = length
>
> for i in _functions:
> length = len(str(i))
> if length > max_length:
> max_length = length
>
> underscore = "_"
> for i in range (0,(max_length-20)/2):
> underscore += "_"
>
> _file.write(underscore +"SOLUTIONS"+ underscore +"\n")
> for i in _solutions:
> for u in i:
> _file.write(str(u) + " = " + str(Float(i[u],sig_figs))+"\n")
>
> _file.write("\n" + underscore +"EQUATIONS"+ underscore +"\n")
> #_file.write("Compiler Assumes All Equations = 0 Unless specified\n")
> print len(_functions)
> for i in _functions:
> _file.write(str(i)+"\n")
> _file.write("\n\n\n\n")
>
> --
> You received this message because you are subscribed to the Google Groups
> "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sympy.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/sympy/89416b65-b1b1-40e4-b608-1d4a93be9a1f%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/CADDwiVDc%2Bjum%3DKk40mmDUjxhZs7ns0ekge-B%3DUBkfN0k52kSqA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to