Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I am trying to solve a system of three nonlinear equations using Mathematica. Solve takes forever to run and never solves my system of equations. Is my system too complicated?

I have looked through the suggestions on using Solve in the Mathematica help, but none of these seem to work. I am wondering if I am going about solving the problem the wrong way.

Any help would be greatly appreciated! I have attached my code below.

Solving the Tensegrity Model

Defining reference conditions

l0 = Sqrt[0.375];
s0 = 0.5 ;
k = 1;

Using prestress to define

ξ = 1 - lR/l0;

lR[ξval_] := l0 (1 - ξval);

lRvalues = Table[lR[ξrange], {ξrange, {0.0, 0.1, 0.5, 0.9, 1.0}}];

Defining cable lengths

Clear[sx, sy, sz]
l1[sx_] := 0.5 Sqrt[sx^2 + sy^2 - 2 sy + 2];
l2 := 0.5 Sqrt[sy^2 + sz^2 - 2 sz + 2];
l3[sx_] := 0.5 Sqrt[sz^2 + sx^2 - 2 sx + 2];

F1[lR_] = k (l1[sx] - lR);
F2[lR_] = k (l2 - lR);
F3[lR_] = k (l3[sx] - lR);

F1values = Table[F1[lr], {lr, lRvalues}];
F2values = Table[F2[lr], {lr, lRvalues}];
F3values = Table[F3[lr], {lr, lRvalues}];
F1values[[1]] /. sx -> 0.5
(*-0.612372 + 0.5 Sqrt[2.25 - 2 sy + sy^2]*)

sxval = Range[0.5, 2, 0.5];
For[j = 1, j < Length[sxval] + 1, j++,
 For[i = 1, i < Length[F1values] + 1, i++,
  Solve[{(F1values[[i]] /. sx -> sxval[[j]]) (1 - sy)/l1[sxval[[j]]] == 
     F2values[[i]] sy/l2, 
    F2values[[i]] (1 - sz)/l2 == (F3values[[i]] /. sx -> sxval[[j]]) sz/
      l3[sxval[[j]]], 
    T == 2 ((F1values[[i]] /. sx -> sxval[[j]]) sxval[[j]]/
         l1[sxval[[j]]] + (F3values[[i]] /. sx -> sxval[[j]]) (
         sxval[[j]] - 1)/l3[sxval[[j]]])}, {T, sy, sz}]
  (*sy1 = NSolve[(F1values[[i]] /. sx -> sxval[[j]]) (1 - sy)/l1[sxval[[j]]] ==
  F2values[[i]] sy/l2, sy, Reals] // FullSimplify;*)
  (*Print[sy1]*)
  ]
 ]`
share|improve this question
1  
You haven't replaced all values of sx in your expression inside the loop. Is this correct? If you do this and also change solve to FindRoot (starting with sensible values) it solves it very quickly. –  Jonathan Shock Mar 19 '13 at 3:10
    
All the values of sx should be gone in the solve function (I recently edited the post so that's the case at least)... –  Alicia Mar 19 '13 at 3:35
    
sx still appears in the function as far as I can tell, both in the first and second elements of the list. –  Jonathan Shock Mar 19 '13 at 3:48
    
I changed the definitions of F2values and F3 values (updated in the above post), and I think that removed all of the sx values from the solve function. I did FullSimplify of the individual terms and all sx terms were gone. –  Alicia Mar 19 '13 at 4:19

1 Answer 1

up vote 2 down vote accepted

Instead of Solve, I recommend FindRoot:

FindRoot[{
  (F1values[[i]] /. sx -> sxval[[j]]) (1 - sy)/l1[sxval[[j]]] == F2values[[i]] sy/l2, 
  F2values[[i]] (1 - sz)/l2 == (F3values[[i]] /. sx -> sxval[[j]]) sz/l3[sxval[[j]]], 
  T == 2 ((F1values[[i]] /. sx -> sxval[[j]]) sxval[[j]]/l1[sxval[[j]]] + (F3values[[i]] /. 
         sx -> sxval[[j]]) (sxval[[j]] - 1)/l3[sxval[[j]]])
  },
  {{T, 0}, {sy, 0}, {sz, 0}}]

That should work. In the current loop, it won't print anything, so you will have to include a Print statement or similar to see what is actually happening.

share|improve this answer
    
Thanks Jonathan! I used FindRoot like you suggested and that worked much better. I really appreciate your help :) –  Alicia Mar 19 '13 at 4:36
    
Be careful that there is only a single solution as Findroot will, in general find the solution close to the starting values that you set. If you are looking at a system with multiple solutions then you will miss some with this method. –  Jonathan Shock Mar 19 '13 at 4:39
    
Sounds good! I have some graphs to compare my results too so I will look into that... –  Alicia Mar 19 '13 at 6:37

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.