Newsgroup: it.comp.lang.visual-basic
Titolo: equazione

Ho scritto questa piccola routine per risolvere questa equazione di 3°
grado in X.
Come vedi nella listbox "list1" scrive il valore di x e il
corrispondente Y. Io allora cerco il valore di Y piu' piccolo e trovo
la X. Come faccio a dire al computer di estrarmi dalla listbox il
valore di Y piu' piccolo al quale corrisponde la X???
C'e' un altro modo per risolvere un equazione di 3° grado?? Potete
mandarmi qualche riga di codice? 
Grazie 
Dim x As Single
Dim y As Single
Const b = 40
Const C = 10
Const A = 10
Const h = 36
Const d = 4
For x = 0.1 To 50 Step 0.01
I = ((b * x ^ 3) / 3) + (15 * C * (x - d) ^ 2) + (15 * A * (h - x) ^
2)
S = ((b * x ^ 2) / 2) + (15 * C * (x - d)) - (15 * A * (h - x))
y = (I / S) + (-x + 36)
List1.AddItem x & "       " & y & "      " & I & "     " & S
'Dim z As Single
'z = Abs(x - y)
'Text1.Text = z
Next x

 mandarmi qualche riga di codice?
Per le equazioni di 3 grado esiste la soluzione 'esatta' cerca su un
buon libro di analisi matematica ( mi dispiace ma non la ricordo )

 Grazie
Ciao:
 Ti invio una routine per trovare le radici delle equazioni cubiche.
E' tratta (quasi direttamente) dal metodo di Cardano (o Tartaglia?)
e trova le tre radici anche quando due di esse sono complesse o
coincidenti.
'---------------------------------------------------------------------
Private Type Complex
    r As Double  ' parte reale.
    i As Double  ' parte immaginaria.
End Type
Private Sub DRTEQ3(ByVal a#, ByVal b#, ByVal c#, ByVal d# _
    , x1 As Complex, x2 As Complex, x3 As Complex, Optional Nr&)
'
'   Risolve l' equazione cubica a*x^3 + b*x^2 + c*x + d = 0
'
'    a, b, c, d: coefficienti, dati, dell' equazione.
'    x1, x2, x3: soluzioni, complesse, dell' equazione.
'    Nr:         numero di soluzioni reali e distinte.
'
    Dim f#, g#, h#
    Dim Ar#, Br#
    Dim g_2n#, rg_2n#, b3a#
    Dim r#, cr#, t#, ct3#, st3#
'
    f = ((3# * c / a) - ((b / a) ^ 2)) / 3#
    g = (2# * ((b / a) ^ 3) - (9# * b * c / (a ^ 2)) + (27# * d / a)) / 27#
    h = ((g ^ 2) / 4#) + ((f ^ 3) / 27#)
    g_2n = -g / 2#
    b3a = b / (3# * a)
'
    Select Case h
        Case Is > 0 ' Una soluzione reale, le altre due complesse coniugate.
        Ar = Cur(g_2n + Sqr(h))
        Br = Cur(g_2n - Sqr(h))
        x1.r = Ar + Br - b3a
        x1.i = 0#
        x2.r = -((Ar + Br) / 2#) - b3a
        x2.i = Sqr(3#) * (Ar - Br) / 2#
        x3.r = x2.r
        x3.i = -x2.i
        Nr = 1
'
        Case Is = 0 ' Tre soluzioni reali, di cui due coincidenti.
        rg_2n = Cur(g_2n)
        x1.r = 2# * rg_2n - b3a
        x1.i = 0#
        x2.r = -rg_2n - b3a
        x2.i = x1.i
        x3.r = x2.r
        x3.i = x2.i
        Nr = 2
'
        Case Is < 0 ' Tre soluzioni reali distinte.
        r = Sqr((g_2n ^ 2) - h)
        t = Acos(-g / (2# * r))
        cr = Cur(r)
        ct3 = cr * Cos(t / 3#)
        st3 = Sqr(3#) * cr * Sin(t / 3#)
        x1.r = 2# * ct3 - b3a
        x1.i = 0#
        x2.r = -ct3 - b3a - st3
        x2.i = 0#
        x3.r = -ct3 - b3a + st3
        x3.i = 0#
        Nr = 3
    End Select
'
'
'
End Sub
Private Function Acos(ByVal x As Double) As Double
'
'   Calcola l' ArcoCoseno di x# con -1 <= x <= 1.
'   Acos e' in radianti.
'
    Const PI# = 3.14159265358979     ' 4# * Atn(1#)
'
    If 0# < x And x <= 1# Then
        Acos = Atn(Sqr(1# - x * x) / x)
    ElseIf -1# <= x And x < 0# Then
        Acos = PI + Atn(Sqr(1# - x * x) / x)
    ElseIf x = 0# Then
        Acos = PI / 2#
    Else
        Err.Raise 5, "Acos Function", "Argomento illegale per Acos"
    End If
'
'
'
End Function
Private Function Cur(ByVal x As Double) As Double
'
'   Ritorna la radice cubica di x:
'
    Cur = Sgn(x) * (Abs(x)) ^ (1# / 3#)
'
'
'
End Function
'---------------------------------------------------------------------
Ancora ciao e se hai problemi con l' uso contattami pure.
Franco