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();
}
}
}
|