Metody numeryczne

Pomiń łącza nawigacjiStart : Metody numeryczne : Równania nleliniowe : Układ równań  
 Pomiń łącza nawigacji
Wykresy i błędyRozwiń Wykresy i błędy
SzeregiRozwiń Szeregi
InterpolacjaRozwiń Interpolacja
AproksymacjaRozwiń Aproksymacja
FFTRozwiń FFT
Algebra liniowaRozwiń Algebra liniowa
Równania nlelinioweRozwiń Równania nleliniowe
Zagadnienia początkoweRozwiń Zagadnienia początkowe

Pomiń łącza nawigacji.

Przykład rozwiązywania układów równań nieliniowych metodą Newtona

Stworzyć program rozwiązujący układy równań nieliniowych metodą Newtona

Krótki opis metody Newtona znajduję się tutaj.

W pierszej formie równania układu równań i pochodne wpisać w kodzie programu, na formularzu wpisać tylko przybliżenie początkowe i wyświetlać kolejne iteracje.

Program może działać jak następujący przykład,działający w przeglądarkach IE, którego przykładowy kod znajduje się u dołu strony.

W programie posłużyć się biblioteką MathNet Numerics.

Przykłady układów równań, które należy rozwiązać znajdują się tutaj tutaj, plik Brown.pdf

Kolejna wersja programu powinna umożliwić wpisywanie równań i pochodnych w formie wyrażeń na formularzu, jak w przykładzie na stronie.
Należy wykorzystać bibliotekę Ncalc.

Przykładowy kod programu z równaniami i pochodnymi zapisanymi wewnątrz kodu.

using MathNet.Numerics.LinearAlgebra.Double;

namespace NewtonSys
{
   
public partial class Form1 : Form
   
{
       
public Form1()
       
{
           
InitializeComponent();
       
}

        const int N = 2;                // liczba równań
       
Vector X = new DenseVector(N);  // wektor X

        Vector Y()                      // wektor Y = F(X)
       
{
           
Vector y = new DenseVector(N);

            y[0] = X[0] * X[0] + 8 * X[1] - 16;
           
y[1] = X[0] - Math.Exp(X[1]);

            return y;
        }

        Matrix dY()                     // macierz pochodnych df[i]/dx[j]
       
{
           
Matrix dy = new DenseMatrix(N, N);

            dy[0, 0] = 2 * X[0];    dy[0, 1] = 8;
           
dy[1, 0] = 1;           dy[1, 1] = -Math.Exp(X[1]);

            return dy;
       
}

        private void buttonIteracja_Click(object sender, EventArgs e)
       
{
           
X = (Vector)(X - (Vector)(dY().Inverse() * Y()));  // X[n+1] = X[n] - inv(dY[n]) * Y[n]

            // wydruk kolejnego przybliżenia
           
textBoxX.Clear();
           
for (int w = 0; w < X.Count; w++)        
               
textBoxX.AppendText(X[w].ToString() + Environment.NewLine);
       
}

        void start()    // czytanie wektora przybliżenia początkowego
       
{

           
for (int i = 0; i < textBoxX0.Lines.Length; i++)
               
X[i] = Convert.ToDouble(textBoxX0.Lines[i]);
           
           
textBoxX.Clear();
       
}

        private void Form1_Load(object sender, EventArgs e)
       
{
           
start();
       
}

        private void buttonStart_Click(object sender, EventArgs e)
       
{
           
start();
       
}
   
}
}

 

 Wydział Elektryczny