Ratkaisuja, joita Maplen fsolve ei löydä

Kokeillaan samaa yhtälöryhmää, jota käytettiin esimerkkinä myös c05-työkalun yhteydessä parametrilla a = 1:
> read `groebner.mpl`;

> toinenesimf:=[z^2-x^2-y^2+2*a*x+2*a*z-a^2, y*z-a*y-a*x+a^2, -2*a+x+y];

  toinenesimf :=

        2    2    2                    2                     2
      [z  - x  - y  + 2 a x + 2 a z - a , y z - a y - a x + a , - 2 a + x + y]

> joo:=generalsolve(toinenesimf, {x,y,z});

joo := [
                    2    2                      2    2                2    2
    {z = - RootOf(_Z  + a ), x = 2 a - RootOf(_Z  + a ), y = RootOf(_Z  + a )},

                    2             2                        2             2
    {y = RootOf(2 _Z  - 2 a _Z - a ), x = 2 a - RootOf(2 _Z  - 2 a _Z - a ),

                                 2             2
        z = - 2 a + 2 RootOf(2 _Z  - 2 a _Z - a )}                           ]

> map(x->evala(subs(x,toinenesimf)),joo);

                                   {[0, 0, 0]}


Kas vain, menetelmämme tuotti ratkaisun, joka tosiaan toteuttaa yhtälön. Edellä tuntemattomat annettiin joukkona, mutta generalsolve ei ole turhantarkka; jos ne jätetään antamatta, Maple tulkitsee kaikki muuttujat tuntemattomiksi:
> generalsolve(toinenesimf);
[{x = 0, y = 0, a = 0, z = 0},

                              2               2
 {a = a, y = a + 1/2 RootOf(_Z  + 2 a _Z - 2 a ),

                          2               2                2               2
     x = a - 1/2 RootOf(_Z  + 2 a _Z - 2 a ), z = RootOf(_Z  + 2 a _Z - 2 a )},

 {x = 0, y = 0, a = 0, z = 0}, {z = I a, a = a, y = - I a, x = 2 a + I a},

 {a = a, x = 2 a - I a, y = I a, z = - I a}]

Tässä tapauksessa Maple ei voinut tietää, että a:tä halutaan pitää parametrina. Onneksi se kuitenkin valitsi sen vapaaksi parametriksi.

Tuntemattomat voidaan myös antaa listana, kuten seuraavassa. Tällöin tuntemattomien järjestys kiinnittää leksikografisella järjestyksellä lasketun Groebnerin kannan. Tämän vaikutuksista lisää tuonnempana.

Jos neljänneksi argumentiksi annetaan sana verbose, näkyviin saadaan enemmän informaatiota, polynomiyhtälöiden tapauksessa lasketut Groebner-kannat.

Polynomiyhtälöitä ratkottaessa saadaan Groebnerin kantoja käyttämällä kaikki ratkaisut, joten alkuarvausta ei tässä tapauksessa tarvita. Kolmas argumentti on kuitenkin varattu alkuarvausta varten.


> generalsolve(toinenesimf, [x,y,z], [], `verbose`);

The Groebner bases are:
[[-2*a+x+y, y+z, y^2+a^2], [-2*a+x+y, 2*a-2*y+z, 2*y^2-2*a*y-a^2]]


                  2    2                      2    2                2    2
 [{z = - RootOf(_Z  + a ), x = 2 a - RootOf(_Z  + a ), y = RootOf(_Z  + a )},

                     2             2                        2             2
     {y = RootOf(2 _Z  - 2 a _Z - a ), x = 2 a - RootOf(2 _Z  - 2 a _Z - a ),

                                  2             2
         z = - 2 a + 2 RootOf(2 _Z  - 2 a _Z - a )}                           ]


Verrataan seuraavaksi Maplen numeerisen ratkaisun oletusrutiinia fsolve ja omaa menetelmäämme. Tätä varten kiinnitetään parametrin a arvo ykköseksi.
> a:=1;
                                     a := 1

> joo:=generalsolve(toinenesimf, {x,y,z});

                       2                        2                      2
 joo := [{y = RootOf(_Z  + 1), x = 2 - RootOf(_Z  + 1), z = - RootOf(_Z  + 1)},

                         2                               2
     {x = 2 - RootOf(2 _Z  - 2 _Z - 1), z = 2 RootOf(2 _Z  - 2 _Z - 1) - 2,

                        2
         y = RootOf(2 _Z  - 2 _Z - 1)}                                      ]

> num:=evalf(joo);

           num := [{x = 2. + 1. I, z = 1. I, y =  - 1. I},

               {z = -2.732050808, y = -.3660254038, x = 2.366025404}]

> map(x->subs(x,toinenesimf),num);

                                         -8          -9
                       [[0, 0, 0], [.1*10  , 0, .2*10  ]]

Saatiin siis kaksi ratkaisua. Maplen fsolve löytää niistä kerralla vain toisen:
> fsolve(convert(map(x->x=0,toinenesimf),set), {x,y,z});

              {z = -2.732050808, y = -.3660254038, x = 2.366025404}

> fsolve(convert(map(x->x=0,toinenesimf),set), {x,y,z}, complex);

              {z = -1.*I, x = 2.-1.000000000*I, y = 1.000000000*I}

Katsotaan seuraavaksi, mitä generalsolve tekee, kun yhtälöt eivät ole polynomeja.
Kenrick Bingham 13.5.1996