Results 1 to 6 of 6

Thread: Validate algebraic equations.

  1. #1

    Thread Starter
    Hyperactive Member DavesChillaxin's Avatar
    Join Date
    Mar 2011
    Location
    WNY
    Posts
    451

    Validate algebraic equations.

    At the moment I'm in the process of building a class that can handle more advanced mathematical equations and processes. Essentially my end goal is to to have my class capable of processing anything you'd learn in Elementary Algebra through College Algebra.

    So far I am able to multiply monomials and order polynomials.. However for the most part the equations in questioned being processed have to be in correct form. IE Point-Slope Form, Y-Intercept Form, etc etc.

    I'm just curious as to how I can go about "validating an equation type by it's current form". If there is an easier way or not that I'm unaware of, or if I'm just stuck manually doing so.
    Please rate if my post was helpful!
    Per favore e grazie!




    Code Bank:
    Advanced Algebra Class *Update | True Gradient Label Control *Dev | A Smarter TextBox *Update | Register Global HotKey *Update
    Media Library Beta *Dev | Mouse Tracker (Available in VB.net and C#.net) *New | On-Screen Numpad (VB.net) *New

  2. #2
    Fanatic Member BlindSniper's Avatar
    Join Date
    Jan 2011
    Location
    South Africa
    Posts
    865

    Re: Validate algebraic equations.

    There are two codebank entries that will probably give you your answer.
    http://www.vbforums.com/showthread.php?t=658223
    http://www.vbforums.com/showthread.php?t=663931

    Useful CodeBank Entries of mine
    Expand Function
    Code Compiler
    Sudoku Solver
    HotKeyHandler Class

    Read this to get Effective help on VBForums
    Hitchhiker's Guide to Getting Help at VBF

  3. #3
    New Member
    Join Date
    Nov 2011
    Posts
    1

    Re: Validate algebraic equations.

    is there any readymade classes and objects for solving and validating algebraic equations?? i want to give a project on that in vb.net so please is there any code or any help you wanna give me please post about that....

  4. #4
    Fanatic Member BlindSniper's Avatar
    Join Date
    Jan 2011
    Location
    South Africa
    Posts
    865

    Re: Validate algebraic equations.

    First of all, You search before making a post, second if there is nothing in the search you create your own thread (instead of hijacking someone else thread asking unrelated questions) and ask there, and when you make a post please use the default font, size and style.

    EDIT: and I don't know how you missed the links I posted above doing almost exactly what you need.

    Useful CodeBank Entries of mine
    Expand Function
    Code Compiler
    Sudoku Solver
    HotKeyHandler Class

    Read this to get Effective help on VBForums
    Hitchhiker's Guide to Getting Help at VBF

  5. #5

    Thread Starter
    Hyperactive Member DavesChillaxin's Avatar
    Join Date
    Mar 2011
    Location
    WNY
    Posts
    451

    Re: Validate algebraic equations.

    Well so far this is what I've came up with. It works, very buggy. But works nonetheless. However every combination of numbers and operations I've tried seem to get evaluated correctly at the moment. Anything syntax that isn't correct will throw an error, but again that just brings me back to my original post. I'm still working on a function that "validates" an expression for proper syntax.

    It supports (), *, /, +, -, and ^.. No Square roots yet.

    However if you have for example (-9)^2, (-9) gets replaced with [-9] during the process of evaluating the expression. I had to do this just so all negative constants are handled correctly when raising them to a power. Soo I'm assuming, and have yet to test this but using any brackets will cause an exception to be thrown.

    Enumerators
    Code:
        Enum Operations
            Exponents = 1
            Parenthesis = 2
            Multiplication = 3
            Division = 3
            Addition = 4
            Subtraction = 4
        End Enum
    Solve expression function.
    Code:
        ''' <summary>
        ''' Evaluates a mathematical expression.
        ''' </summary>
        ''' <param name="expression">String; Mathematical expression to be evaluated.</param>
        ''' <returns>Double; Solution.</returns>
        Function SolveExpression(ByVal expression As String) As Double
            Dim result As String = expression
            Dim cArray() As Char = expression.ToCharArray()
            Dim oP As Int32 = 0, cP As Int32 = 0
            Dim c As Int32 = cArray.Count-1
            Dim p As String 'Part of the expression extracted to be solved.
            Dim s As String 'Solution
    
            If result.Contains("(") Then
                Do While result.Contains("(") 'Loop through the expression until all parenthesis have been processed.
                    For i As Int32 = result.IndexOf("(") to c 'Start at the first opening parenthesis
                        If cArray(i) = "("C Then oP = i+1 'Remember the position of the opening parenthesis everytime one has been found.
                        If cArray(i) = ")"C Then 'Continue to look for the first closing parenthesis.
                            cP = i 'Remember the position.
                            Exit For 'Exit out of the for loop, we
                        End If
                    Next
                    p = result.Substring(oP,cP-oP) 'Extract the inner expression to be evaluated.
                    s = SolveSubExpression(p).ToString()
    
                    If cP+1 <= c Then 'Make sure were checking inside the range.
                        If cArray(cP+1) = "^" Then
                            s = "[" & s & "]"
                        End If
                    End If
    
                    'Replace the sub expression including parenthesis with the solution to said sub expression.
                    result = result.Replace("(" & p & ")", s)
                    cArray = result.ToCharArray() 'Update character array.
                Loop 'Do it all over again till all parenthesis are gone.
            End If
    
            'Finally solve for the last expression that may be, and return the solution.
            Return SolveSubExpression(result)
        End Function
    All other sub functions used to solve an expression.
    Code:
        ''' <returns>Evaluates a sub expression - one that does not contain any parenthesis.</returns>
        Protected Function SolveSubExpression(ByVal expression As String) As Double
            'The expression being passed cannot cotain any parenthesis.
            If Not expression.Contains("(") Or Not expression.Contains(")") Then
                Dim result As String = expression.Replace(" ", vbNullString)
                Dim cArray() As Char = result.ToCharArray()
    
                'Perform the order of operations.
                '1) Solve exponents.
                result = PerformOperation(result, Operations.Exponents)
    
                '3) Solve all multiplication and division operations.
                result = PerformOperation(result, Operations.Multiplication And Operations.Division)
    
                '4) Solve all addition and subtraction operations.
                result = PerformOperation(result, Operations.Addition And Operations.Subtraction)
                
                Return Convert.ToDouble(result) 'Return the final solution as a double.
            Else
                MessageBox.Show("Expression cannot contain parenthesis.")
                Return 0
            End If
        End Function
    
        ''' <returns>Evaluates a particular operation(s) of an expression.</returns>
        Protected Function PerformOperation(ByVal expression As String, ByVal Operation As Operations) As String
            Dim result As String = expression.Replace(" ", vbNullString)
            Dim cArray() As Char = result.ToCharArray()
    
            Select Case Operation
                Case Operations.Exponents
                    If result.Contains("^") Then
                        Do While result.Contains("^") 'Loop through the expression until all root have been evaluated.
                            '   Constant                    Exponent
                            Dim c As String = vbNullString, e As String = vbNullString
                            Dim v As Double 'Value.
                            Dim Brackets As Boolean = False
    
                            'Obtain the constant.
                            If cArray((result.IndexOf("^")-1)) = "]"C Then
                                For i As Int32 = (result.IndexOf("^")-2) To 0 Step (-1)
                                    If cArray(i) = "["C Then Exit For
                                    c = cArray(i).ToString & c
                                Next
                                Brackets = True
                            Else
                                For i As Int32 = (result.IndexOf("^")-1) to 0 Step (-1)
                                    If Char.IsNumber(cArray(i)) or cArray(i).ToString = "." Then
                                        c = cArray(i).ToString() & c
                                    Else
                                        Exit For
                                    End If
                                Next
                            End If
    
                            'Obtain the exponent.
                            For i As Int32 = result.IndexOf("^")+1 to cArray.Count-1
                                If Char.IsNumber(cArray(i)) or cArray(i) = "."C Then
                                    e = e & cArray(i).ToString()
                                Else
                                    Exit For
                                End If
                            Next
    
                            'Calculate the value.
                            v = Convert.ToDouble(c)^Convert.ToDouble(e)
                            If Brackets Then
                                result = result.Replace("[" & c & "]^" & e, v.ToString()) 'Insert the value into the expression.
                            Else
                                result = result.Replace(c & "^" & e, v.ToString()) 'Insert the value into the expression.
                            End If
                            cArray = result.ToCharArray() 'Update the character array.
                        Loop
                    End If
                Case Operations.Multiplication And Operations.Division 'Both multiplication and division get processed the same.
                    If result.Contains("/") Then
                        Do While result.Contains("/")
                            Dim constants(1) As String
                            Dim t As Double = 0 'Total
    
                            For i As Int32 = result.IndexOf("/")-1 To 0 Step -1
                                If Char.IsNumber(cArray(i)) Then
                                    constants(0) = cArray(i).ToString & constants(0)
                                Else
                                    Exit For
                                End If
                            Next
                            For i As Int32 = result.IndexOf("/")+1 To cArray.Count-1
                                If Char.IsNumber(cArray(i)) Then
                                    constants(1) = constants(1) & cArray(i).ToString
                                Else
                                    Exit For
                                End If
                            Next
    
                            t = Convert.ToDouble(constants(0))/Convert.ToDouble(constants(1))
    
                            result = result.Replace(constants(0) & "/" & constants(1), t.ToString())
                            cArray = result.ToCharArray()
                        Loop
                    End If
                    If result.Contains("*") Then
                        Do While result.Contains("*")
                            Dim constants(1) As String
                            Dim t As Double = 0 'Total
    
                            For i As Int32 = result.IndexOf("*")-1 To 0 Step -1
                                If Char.IsNumber(cArray(i)) Then
                                    constants(0) = cArray(i).ToString & constants(0)
                                Else
                                    Exit For
                                End If
                            Next
                            For i As Int32 = result.IndexOf("*")+1 To cArray.Count-1
                                If Char.IsNumber(cArray(i)) Then
                                    constants(1) = constants(1) & cArray(i).ToString
                                Else
                                    Exit For
                                End If
                            Next
    
                            t = Convert.ToDouble(constants(0))*Convert.ToDouble(constants(1))
    
                            result = result.Replace(constants(0) & "*" & constants(1), t.ToString())
                            cArray = result.ToCharArray()
                        Loop
                    End If
                Case Operations.Addition And Operations.Subtraction 'Addition and subtraction must be processed at the same time.
                    If result.Contains("+") Or result.Contains("-") Then
                        Dim constants() As String
                        Dim t As Double = 0 'Total.
    
                        'Fix any double operators we may have left over.
                        If result.Contains("+-") Then result = result.Replace("+-", "-")
                        If result.Contains("-+") Then result = result.Replace("-+", "-")
                        If result.Contains("++") Then result = result.Replace("++", "+")
                        If result.Contains("--") Then result = result.Replace("--", "+")
                        'Add in the seperator at every operand.
                        result = result.Replace("+", " +")
                        result = result.Replace("-", " -")
                        'Split the result to obtain all constants.
                        constants = result.Split(" "C)
    
                        For i As Int32 = 0 to constants.Count-1
                            If constants(i) <> vbNullString Then
                                t = t + Convert.ToDouble(constants(i))
                            End If
                        Next
    
                        result = t.ToString()
                    End If
            End Select
    
            Return result
        End Function
    Hope this helps anyone looking for a direction in accomplishing the same task. But if anyone that has had experience in this topic that has any pointers feel free to be a critic.

    Just keep in mind this is my "Draft" if you will.. I code, I get it to work by any means necessary, then once it functions properly I go through and finalize. Sooo if anything is terribly wrong then I probably know about it.. or will.

    EDIT: I forgot to add that my process can't handle 2(2) yet, however it can handle 2*(2). This'll be fixed shortly.
    Last edited by DavesChillaxin; Nov 8th, 2011 at 02:59 PM.
    Please rate if my post was helpful!
    Per favore e grazie!




    Code Bank:
    Advanced Algebra Class *Update | True Gradient Label Control *Dev | A Smarter TextBox *Update | Register Global HotKey *Update
    Media Library Beta *Dev | Mouse Tracker (Available in VB.net and C#.net) *New | On-Screen Numpad (VB.net) *New

  6. #6

    Thread Starter
    Hyperactive Member DavesChillaxin's Avatar
    Join Date
    Mar 2011
    Location
    WNY
    Posts
    451

    Re: Validate algebraic equations.

    FIX: Can now handle n(n) or vice versa (n)n. Little bugs have been fixed as well so give it a shot. However proper syntax is still required, otherwise exceptions will arise.

    Code:
        Function SimplifyAlgebraicExpression(ByVal expression As String) As Double
            Dim result As String = expression.Replace(")(", ")*(")
            Dim cArray() As Char = expression.ToCharArray()
            Dim oP As Int32 = 0, cP As Int32 = 0
            Dim p As String 'Part of the expression extracted to be solved.
            Dim s As String 'Solution
            Dim Bracket As Boolean = False
    
            If result.Contains("(") Then
                Dim c As Char
    
                'Fix any multiplication that may be without the operator. IE x(x), which is required to look like x*(x).
                For i As Int32 = result.IndexOf("(") to (cArray.Count-1) 'Start at the first opening parenthesis
                    If cArray(i) = "("C AndAlso i-1 >= 0 Then
                        c = cArray(i-1)
                        If Char.IsNumber(c) Then
                            result = result.Replace(c & "(", c & "*(")
                        End If
                    End If
                    If cArray(i) = ")"C AndAlso i+1 <= cArray.Count-1 Then 'Continue to look for the first closing parenthesis.
                        c = cArray(i+1)
                        If Char.IsNumber(c) Then
                            result = result.Replace(")" & c, ")*" & c)
                        End If
                    End If
                Next
    
                'Loop through the expression until all parenthesis have been evaluated.
                Do While result.Contains("(")
                    cArray = result.ToCharArray
    
                    For i As Int32 = result.IndexOf("(") to (cArray.Count-1) 'Start at the first opening parenthesis
                        If cArray(i) = "("C Then 
                            oP = i+1 'Remember the position of the opening parenthesis everytime one has been found.
                        End If
                        If cArray(i) = ")"C Then 'Continue to look for the first closing parenthesis.
                            cP = i 'Remember the position.
                            Exit For 'Exit out of the for loop, we
                        End If
                    Next
    
                    p = result.Substring(oP,cP-oP) 'Extract the inner algebraic expression to be evaluated.
                    s = SimplifySubAlgebraicExpression(p).ToString()
    
                    If cP+1 <= cArray.Count-1 Then 'Make sure we're within range.
                        If cArray(cP+1) = "^" Then 'Check if the sub algebraic expression as a whole has any exponents.
                            s = "[" & s & "]^" 'Add brackets around the solution, which will be handled when solving for exponents.
                            Bracket = True
                        End If
                    End If
    
                    'Replace the sub expression including parenthesis with the solution to said sub expression.
                    If Bracket Then
                        result = result.Replace("(" & p & ")^", s)
                        Bracket = False
                    Else
                        result = result.Replace("(" & p & ")", s)
                    End If
                    
                    cArray = result.ToCharArray() 'Update character array.
                Loop 'Do it all over again till all parenthesis are gone.
            End If
    
            'Finally solve for the last expression that may be, and return the solution.
            Return SimplifySubAlgebraicExpression(result)
        End Function
    Last edited by DavesChillaxin; Nov 10th, 2011 at 12:18 PM. Reason: EDIT: There was a little bug that went unoticed. Now no longer exists.
    Please rate if my post was helpful!
    Per favore e grazie!




    Code Bank:
    Advanced Algebra Class *Update | True Gradient Label Control *Dev | A Smarter TextBox *Update | Register Global HotKey *Update
    Media Library Beta *Dev | Mouse Tracker (Available in VB.net and C#.net) *New | On-Screen Numpad (VB.net) *New

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width