Hi Brett,

On Thu, Jun 11, 2015 at 5:37 PM, Brett Smith <[email protected]> wrote:
> 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

Interesting, it looks like TK Solver
(http://en.wikipedia.org/wiki/TK_Solver) was invented by Miloš
Konopásek (http://en.wikipedia.org/wiki/Milos_Konopasek), born in the
same country as I was.

> 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

I think this would be a welcome addition. We need to learn about the
algorithms and state of the art to solve these kinds of problems. If
it is a polynomial system of equations, then Gröbner basis is one such
method and SymPy has such capability. But I am not an expert in that.
It looks like you are after a numerical solution, so that's what I
would recommend at first. It might be much easier to implement. You
should open source it. Depending on which language you'll use to
implement it, it can go to SciPy or a separate library. I like that
you are trying to find or implement an open source solution. I am the
same way, thus SymPy was born.

Can you describe the symbolic structure of those equations --- what
kind of non-linearity is allowed? Because perhaps you can tell SymPy
to first eliminate the linear system, which SymPy should be able to
do, and then we just need to handle the nonlinear part. One way is to
take one equation and substitute into the rest, and so on. This only
works for some non-linear systems. If it is more non-linear, it might
not be easy to eliminate a variable from an equation, then you need
something more advanced.

E.g. these are a bit tricky:

> Sa^2 = 3*T14^2
> Sb^2 = 3*T12^2
> Sc^2 = 3*T43^2
> Sd^2 = 3*T32^2

But you can help it by solving two cases, first:

Sa = + sqrt(3) * T14
...

and the second:

Sa = - sqrt(3) * T14

And you'll have two solutions. It might be that the whole system
doesn't have a solution for one of the cases, so then you end up with
just one solution overall.

What is the application of such systems?

Ondrej


>
> 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]> 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/0ca6f806-1316-4903-8cc2-99732b6b9e07%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/CADDwiVCVoNCNvxei2EbkJS1QipzY%2B_sc5Au4tRe9y%2BQzdVpP2A%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to