Thank you for getting back to me so quickly! I am actually excited about this program, but it seems like I will need to learn a thing or two about numerical analysis. Our class is supposed to use TK Solver, and it seems to work OK. However, I really didn't understand how it worked, or why I was getting the bugs I had. In addition, TK is only a numerical solver. As far as I can tell it will NOT present an answer as a function of other variables.
I feel like in the long the run, developing and building my own suite (and hopefully sharing) of functions would save me a lot of time in the future, especially if I plan on doing engineering design work. I attached a revised version of the solver.py file, and the input file. Everything works perfectly. I have 32 linear functions, 4 non-linear functions and 36 unknown variables. It takes my program about 1.1s to run and solve. I would like to add the following equations to the file "P5-9-Reactions.txt": Na = Sy/Sa Nb = Sy/Sb Nc = Sy/Sc Nd = Sy/Sd Sy = 400*10^6 Sa^2 = 3*T14^2 Sb^2 = 3*T12^2 Sc^2 = 3*T43^2 Sd^2 = 3*T32^2 T14 = F14/A T12 = F12/A T43 = F43/A T32 = F32/A A = pi*d^2/4 d = .008 It seems to me that system is still determinant, with 51 unknowns and 51 equations. However, as far as I can tell, the system hangs/runs indefinitely. Because sympy is capable of delivering symbolic answers, I don't mind a long execution time, as long as it is actually converging onto a solution, not just running off to infinity... That being said, I do not understand the underpinnings of a numerical solver, much less a symbolic run. In a class I am taking online we have gone over linear gradient descent and thats about all I know about the subject - besides just doing symbolic analysis by hand. Any ideas on how I can get this to solve? I have grown attached to sympy, numpy, and matplotlib. I think they are very powerful, and I would like to see more tools become free and open source :P On Thursday, June 11, 2015 at 12:05:11 PM UTC-7, Ondřej Čertík wrote: > > Hi Brett, > > On Thu, Jun 11, 2015 at 12:26 PM, Brett Smith <[email protected] > <javascript:>> 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] <javascript:>. > > To post to this group, send email to [email protected] > <javascript:>. > > 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/0ca6f806-1316-4903-8cc2-99732b6b9e07%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
