On Thu, Jun 11, 2015 at 9:35 PM, Ondřej Čertík <[email protected]> wrote:
> 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

Actually, you have 2 cases per each of the 4 equations, thus 2^4 = 16
cases total, you need to do all possible combinations.

>
> 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/CADDwiVD2h0XHFUWL58JxPF_-Oyw3gAUw_s6h01hpd_Ftc6rcRg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to