Mathematica: speeding up NSolve

  • Mathematica
  • Thread starter Sosi
  • Start date
  • Tags
    Mathematica
In summary, the idea is to use FindRoot to solve the system of equations and then use the results of that to set the operating points for the dependent variables. This approach has sped up the process by a significant amount.
  • #1
Sosi
13
1
Hello everyone!

I have a system of equations which I am trying to solve in order to 13 dependent variables. Yet, I am only interested in the answers which are real positives. In my code I have implemented a way to select only the answer which satisfies this constraint:

Code:
Cases[
 NSolve[
{equations},{variables}],
 {Rule[_, _?NonNegative] ..},
 1 ]

Yet, this is a very slow process, taking about 14 seconds for each value of an independent value that I am considering (and I want to take into consideration several hundreds).

I know that FindRoot is able to speed up this process, but I want to search for a global (not local) solution. Is there any way to speed up this process?

Thanks so much
 
Physics news on Phys.org
  • #2
So are you varying the independent variables in some loop for example using Table? If so the easy answer to your question is that you can speed up the process a bit by using ParallelTable.

Another thing that you could try is the following. Say there is just 1 independent parameter x (this could be modified for more but just to illustrate my point) and say you want to vary it over a range from 0 to 1, by discretizing this interval and checking the solution at each discrete point. Schematically you could do it like this:

0 | ... | ... | ...| ...|1

Each . represents a solution using FindRoot, and each | represents a solution using NSolve. Every time you're trying to do a FindRoot, for the initial guess you use the solution from the point to the left (this could be a FindRoot solution, or an NSolve solution). Because x changes only slightly from each point to the next, and presumably the solutions will maybe depend smoothly on x you shouldn't lose any roots this way. If you do lose some roots, this should be apparent the next time you get to a | point.
 
  • #3
kai_sikorski: thanks for your reply!

My objective is just to get the numerical solution to the system of equations by manually assigning values for an independent variable. Say that the independent variable x varies between 1*^-10 and 1*^-5. In this range, I'm considering ~200 values for x , and then finding the solution to the system of equations.

Your suggestion is a very interesting idea! The issue is that, for each of the 200 values that I attribute to the independent variable, I will have to give a different operating point to the 13 dependent variables. And although I have an idea of the operating points of those dependent variables for the first x value, I have no idea what those operating points may be when I consider other values of x.

Nevertheless, I will try to do what you suggested and see if what I get makes sense :)
 
Last edited:
  • #4
Sosi said:
And although I have an idea of the operating points of those dependent variables for the first x value, I have no idea what those operating points may be when I consider other values of x.

Well the idea is that when you evaluate the second point, you use the results of the first point. When you evaluate the third point you use the results of the second point. If the system varies relatively smoothly with x, you should always have a pretty good guess for the starting values.
 
  • #5
kai_sikorski said:
Well the idea is that when you evaluate the second point, you use the results of the first point. When you evaluate the third point you use the results of the second point. If the system varies relatively smoothly with x, you should always have a pretty good guess for the starting values.

Of course.. I wasn't seeing that. Yes, it should indeed work! I'll try it out and hopefully it runs much faster than NSolve. Thanks!
 
  • #6
Ok, so I setup a function that uses FindRoot to solve the system. I also added a few checkpoints along the run, where the operating points are results taken from a NDSolve command.Results:
Before: System had 10 dependent variables. It took around 5 hours to find solutions to those variables for <100 values of an independent variable.

Now: System has ~15 dependent variables. Takes less than 1 minute to find solution for about 1000 values of an independent variable.

Thanks again for the help, it was very valuable!
 

1. How can I speed up my NSolve function in Mathematica?

To speed up the NSolve function in Mathematica, you can try using the FindRoot function instead. This function uses a different algorithm and can often find solutions faster than NSolve. Additionally, you can try specifying a smaller value for the PrecisionGoal and AccuracyGoal options, which will make the algorithm less precise but potentially faster.

2. Can I use parallel computing to speed up NSolve in Mathematica?

Yes, you can use parallel computing to speed up NSolve in Mathematica. By using the ParallelTable function, you can distribute the computations across multiple cores, which can significantly reduce the solving time. However, this may not always result in faster solutions, so it is important to test and compare the results before using parallel computing.

3. Are there any specific options or settings that can help speed up NSolve in Mathematica?

Yes, there are a few specific options and settings that can help speed up NSolve in Mathematica. One option is to use the Method option and specify a specific algorithm, such as Automatic or "EndomorphismMatrix". Additionally, you can try using the WorkingPrecision option to specify a lower precision, which can also speed up the computation.

4. How can I determine why my NSolve function is running slowly?

If your NSolve function is running slowly, you can use the Timing function to determine how long it is taking to compute the solutions. You can also use the Trace function to see which steps are taking the most time. This can help you identify any specific parts of your code that may be causing the slowdown.

5. Is it possible to use external libraries or packages to speed up NSolve in Mathematica?

Yes, it is possible to use external libraries or packages to speed up NSolve in Mathematica. For example, the RootSearch function from the NumericalMath`RootSearch` package can often find solutions faster than NSolve. You can also explore other packages or libraries that may offer faster algorithms for solving equations.

Similar threads

  • MATLAB, Maple, Mathematica, LaTeX
Replies
6
Views
2K
  • MATLAB, Maple, Mathematica, LaTeX
Replies
5
Views
1K
  • MATLAB, Maple, Mathematica, LaTeX
Replies
2
Views
257
  • MATLAB, Maple, Mathematica, LaTeX
Replies
1
Views
2K
  • Programming and Computer Science
Replies
1
Views
684
  • MATLAB, Maple, Mathematica, LaTeX
2
Replies
52
Views
11K
  • MATLAB, Maple, Mathematica, LaTeX
Replies
4
Views
5K
  • MATLAB, Maple, Mathematica, LaTeX
Replies
5
Views
2K
  • MATLAB, Maple, Mathematica, LaTeX
Replies
1
Views
3K
  • Programming and Computer Science
Replies
1
Views
1K
Back
Top