On Fri, Jun 12, 2015 at 2:53 AM, Brett Smith <[email protected]> wrote: > This system of equations calculates the reaction forces internal to a > machine structure (in this case, vise grip pliers). Then uses the reaction > forces to solve for stress, and eventually, the factor of safety on each > pin connection. > > I have made the changes you have suggested and I still don't get a solution. > I was thinking that by assigning each variable twice might over define the > system: > > Sa = - sqrt(3) * T14 AND Sa = + sqrt(3) * T14 > > Will sympy know to solve this as a pair?
No, you have to plug them there separately. As I said, there is 16 such options. There seem to be other non-linearities, like: F12x + F32x F32y + F12y + P R32x*F32y - R32y*F32x + R12x*F12y - R12y*F12x + Rp*P F43x + F23x F43y + F23y + Fh R43x*F43y - R43y*F43x + R23x*F23y - R23y*F23x + Rh*Fh F14x + F34x F14y + F34y R14x*F14y - R14y*F14x + R34x*F34y - R34y*F34x aren't these missing an equal sign (=)? Or are these equal to 0? I don't understand yet. > Even if I comment out all the negative assignments, I still do not get a > result... > > A numerical result is necessary, but in addition I'd like to play with and > vary the parameters, and perhaps solve large systems for variables I choose > to isolate. You should start by numerical solution of the system. Then if you find one, we can try to find a symbolic solution. At least we'll know that there is one. Ondrej > Looks Grobner basis might be a good place to start looking. I wanted to get > all of this functionality working this weekend so I could use it for a class > project....... buuuuut I might have been overly optimistic with my timeline > haha. Looks like I could learn a lot from studying these kind of numerical > analysis methods. > > For my sympy.solve() call I set the flat "Manual=true", does this change the > method Sympy uses to solve the system? I like the idea of the computer > solving equations the same way I do, but perhaps eventually it is simply not > practical or even possible. > It seems like for most solvers with non-linear systems, you must give the > solver some kind of starting value for it to begin its work. > > I have never actually had any of the code I've wrote make it into an > official distributable package, so that would be really awesome! > Looks like you have done a lot of work for this module! Open source projects > like these are primarily responsible for any success I've had both > professionally and academically :P > > On Thursday, June 11, 2015 at 8:38:14 PM UTC-7, Ondřej Čertík wrote: >> >> 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/db23d376-edff-4bc7-8cab-dce9d2538ed7%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/CADDwiVD4nWqNb08U9Pouah79vkhHQG4Dwqhj9AJ3odj2Qs0U6w%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
