Solving a linear equation

后端 未结 10 1787
悲哀的现实
悲哀的现实 2020-11-27 06:47

I need to programmatically solve a system of linear equations in C, Objective C, or (if needed) C++.

Here\'s an example of the equations:

-44.3940 =          


        
相关标签:
10条回答
  • 2020-11-27 07:22

    Template Numerical Toolkit from NIST has tools for doing that.

    One of the more reliable ways is to use a QR Decomposition.

    Here's an example of a wrapper so that I can call "GetInverse(A, InvA)" in my code and it will put the inverse into InvA.

    void GetInverse(const Array2D<double>& A, Array2D<double>& invA)
       {
       QR<double> qr(A);  
       invA = qr.solve(I); 
       }
    

    Array2D is defined in the library.

    0 讨论(0)
  • 2020-11-27 07:26

    For a 3x3 system of linear equations I guess it would be okay to roll out your own algorithms.

    However, you might have to worry about accuracy, division by zero or really small numbers and what to do about infinitely many solutions. My suggestion is to go with a standard numerical linear algebra package such as LAPACK.

    0 讨论(0)
  • 2020-11-27 07:33

    In terms of run-time efficiency, others have answered better than I. If you always will have the same number of equations as variables, I like Cramer's rule as it's easy to implement. Just write a function to calculate determinant of a matrix (or use one that's already written, I'm sure you can find one out there), and divide the determinants of two matrices.

    0 讨论(0)
  • 2020-11-27 07:37

    Take a look at the Microsoft Solver Foundation.

    With it you could write code like this:

      SolverContext context = SolverContext.GetContext();
      Model model = context.CreateModel();
    
      Decision a = new Decision(Domain.Real, "a");
      Decision b = new Decision(Domain.Real, "b");
      Decision c = new Decision(Domain.Real, "c");
      model.AddDecisions(a,b,c);
      model.AddConstraint("eqA", -44.3940 == 50*a + 37*b + c);
      model.AddConstraint("eqB", -45.3049 == 43*a + 39*b + c);
      model.AddConstraint("eqC", -44.9594 == 52*a + 41*b + c);
      Solution solution = context.Solve();
      string results = solution.GetReport().ToString();
      Console.WriteLine(results); 
    

    Here is the output:
    ===Solver Foundation Service Report===
    Datetime: 04/20/2009 23:29:55
    Model Name: Default
    Capabilities requested: LP
    Solve Time (ms): 1027
    Total Time (ms): 1414
    Solve Completion Status: Optimal
    Solver Selected: Microsoft.SolverFoundation.Solvers.SimplexSolver
    Directives:
    Microsoft.SolverFoundation.Services.Directive
    Algorithm: Primal
    Arithmetic: Hybrid
    Pricing (exact): Default
    Pricing (double): SteepestEdge
    Basis: Slack
    Pivot Count: 3
    ===Solution Details===
    Goals:

    Decisions:
    a: 0.0785250000000004
    b: -0.180612500000001
    c: -41.6375875

    0 讨论(0)
提交回复
热议问题