Przykład zastosowania funkcji do rozwiązywania układu równań liniowych
Wykorzystując metodę Sarrusa, czyli rozwiązanie układu równań przy wykorzystaniu wyznaczników macierzy. Symboliczny zapis układu równań liniowych wygląda jak poniżej
Rozwiązaniem tego układu jest para liczb x i y, ale układ może być sprzeczny (brak rozwiązań) lub nieoznaczony (nieskończenie wiele rozwiązań). Te warunki należy uwzględnić pisząc algorytm rozwiązujący układ dowolnych równań liniowych z dwiema niewiadomymi.
Wartość x i y wyliczymy stosując metodę wyznaczników. Wzorem wartość x i y wyraża się jak poniżej
Gdzie wyznaczniki Wx, Wy i W oblicza się jak poniżej
Warunki rozwiązania układu równań są następujące
- jeżeli W<>0 to istnieje jedno rozwiązanie
- jeżeli W=0 i Wx<>0 lub Wy<>0 to układ jest sprzeczny (brak rozwiązań)
- jeżeli W=0 i Wx=0 i Wy=0 to układ jest nieoznaczony (nieskończenie wiele rozwiązań)
Schemat algorytmu rozwiązującego układ równań liniowych z dwiema niewiadomymi
Proponowany układ kontrolek
W aplikacji wykorzystamy możliwość uaktualnienia postaci równania po wpisaniu współczynnika. Uaktualnienie zrealizujemy w zdarzeniu puszczenia klawisza (KeyUp) w kontrolkach TextBox.
Zaznacz grupę kontrolek TextBox przeznaczonych do wprowadzania współczynników równania pierwszego i drugiego
Przejdź do panelu Właściwości i wybierz zdarzenie KeyUp
W metodzie obsługi zdarzenia KeyUp dla kontrolek równania pierwszego wprowadź poniższy kod
Wskazówka:
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
label7.Text = textBox1.Text + "x" +
"+" + textBox2.Text + "y" +
"=" + textBox3.Text;
}
Wskazówka:
private void textBox4_KeyUp(object sender, KeyEventArgs e)
{
label8.Text = textBox4.Text + "x" +
"+" + textBox5.Text + "y" +
"=" + textBox6.Text;
}
Skompiluj program i sprawdź efekt działania. Prawidłowo działający program pokaże w kontrolkach typu Label postać równania liniowego
Funkcja obliczająca wyznacznik
Piszemy funkcję obliczającą wyznacznik macierzy 2x2. Funkcja będzie mieć cztery argumenty typu rzeczywistego- odpowiednie współczynniki podane z równań. Będzie również zwracać wynik w postaci liczby rzeczywistej.
Wskazówka:
float wyznacznik2x2(float _i1,float _j1,float _i2, float _j2)
{
return _i1 * _j2 - _i2 * _j1;
}
Realizujemy algorytm rozwiązywania układu równań liniowych
W zdarzeniu Click kontrolki Button wprowadź poniższy kod
Wskazówka:
private void button1_Click(object sender, EventArgs e)
{
float a1 = (float)Convert.ToDouble(textBox1.Text),
b1 = (float)Convert.ToDouble(textBox2.Text),
c1 = (float)Convert.ToDouble(textBox3.Text),
a2 = (float)Convert.ToDouble(textBox4.Text),
b2 = (float)Convert.ToDouble(textBox5.Text),
c2 = (float)Convert.ToDouble(textBox6.Text);
float Wx = wyznacznik2x2(c1, b1, c2, b2),
Wy = wyznacznik2x2(a1, c1, a2, c2),
W = wyznacznik2x2(a1, b1, a2, b2);
//wyczyść textBox'a komunikatów
textBox7.Text = null;
float x, y;
//rozwiąż układ równań
if (W != 0) {
x = Wx / W;
y = Wy / W;
textBox7.AppendText("Istnieje jedno rozwiązanie" + Environment.NewLine);
textBox7.AppendText("x = " + x.ToString("F2") + Environment.NewLine);
textBox7.AppendText("y = " + y.ToString("F2"));
}
else
if(Wx==0 && Wy == 0)
textBox7.AppendText("Układ nieoznaczony, nieskończenie wiele rozwiązań");
else
textBox7.AppendText("Układ sprzeczny, brak rozwiązań");
}
Skompiluj program i sprawdź działanie. Poniżej zrzut ekranu działającej aplikacji rozwiązującej dowolny układ równań liniowych z dwiema niewiadomymi
Pełny kod programu
Pełny kod utworzonej aplikacji obliczającej rozwiązania układu równań liniowych z dwiema niewiadomymi
Wskazówka:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _22PojecieFunkcji_UkladRownan
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
float wyznacznik2x2(float _i1,float _j1,float _i2, float _j2)
{
return _i1 * _j2 - _i2 * _j1;
}
private void button1_Click(object sender, EventArgs e)
{
float a1 = (float)Convert.ToDouble(textBox1.Text),
b1 = (float)Convert.ToDouble(textBox2.Text),
c1 = (float)Convert.ToDouble(textBox3.Text),
a2 = (float)Convert.ToDouble(textBox4.Text),
b2 = (float)Convert.ToDouble(textBox5.Text),
c2 = (float)Convert.ToDouble(textBox6.Text);
float Wx = wyznacznik2x2(c1, b1, c2, b2),
Wy = wyznacznik2x2(a1, c1, a2, c2),
W = wyznacznik2x2(a1, b1, a2, b2);
//wyczyść textBox'a komunikatów
textBox7.Text = null;
float x, y;
//rozwiąż układ równań
if (W != 0) {
x = Wx / W;
y = Wy / W;
textBox7.AppendText("Istnieje jedno rozwiązanie" + Environment.NewLine);
textBox7.AppendText("x = " + x.ToString("F2") + Environment.NewLine);
textBox7.AppendText("y = " + y.ToString("F2"));
}
else
if(Wx==0 && Wy == 0)
textBox7.AppendText("Układ nieoznaczony, nieskonczenie wiele rozwiązań");
else
textBox7.AppendText("Układ sprzeczny, brak rozwiązań");
}
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
label7.Text = textBox1.Text + "x" +
"+" + textBox2.Text + "y" +
"=" + textBox3.Text;
}
private void textBox4_KeyUp(object sender, KeyEventArgs e)
{
label8.Text = textBox4.Text + "x" +
"+" + textBox5.Text + "y" +
"=" + textBox6.Text;
}
}
}
Ćwiczenie:
Na podstawie przedstawionego rozwiązania oraz odszukanych informacji w Internecie dotyczących wyznacznika 3x3 napisz aplikację rozwiązującą układ równań z trzema niewiadomymi