Algorytm pierwiastkowania (algorytm Newtona- Raphsona)
Algorytm szukania wartości pierwiastka kwadratowego działa w oparciu szukania wyniku do zadanej dokładności. Wynik kolejnych wyznaczanych wartości szukanego pierwiastka stopnia drugiego obliczany jest według poniższego wzoru
![iteracyjny wzór przybliżonego pierwiastkowania Visual studio C#](./g-VS/alg16Pierwiastkowanie-1.webp)
We wzorze tym suma w nawiasie odpowiada wartości sumy długości boków prostokąta zmierzającego w kolejnych przybliżeniach do boków kwadratu. Pokazuje to poniższy rysunek
![graficzna reprezentacja iteracyjnego wzoru przybliżonego pierwiastkowania Visual studio C#](./g-VS/alg16Pierwiastkowanie-2.webp)
Szukaną wartością pierwiastka jest wartość x (boku kwadratu) wyznaczona z zadaną dokładnością. Liczba pierwiastkowana odpowiada wartości pola kwadratu, stąd bok razy bok jest tym polem. Jest to analogiczne do pierwiastek razy pierwiastek równa się liczbie pierwiastkowanej.
Schemat algorytmu pierwiastkowania
![schemat algorytmu pierwiastkowania Visual studio C#](./g-VS/alg16Pierwiastkowanie-3.webp)
Kod funkcji zapisanej w języku C# realizujący algorytm pierwiastkowania
Wskazówka:
float a = 1.0f,
b = n;
while ((float)Math.Abs(a - b) >= dokladnosc)
{
a = (a + b) / 2;
b = n / a;
}
return (float)(a + b) / 2;
}
Przykładowa aplikacja wykorzystująca algorytm pierwiastkowania
![aplikacja wykorzystująca algorytm pierwiastkowania Visual studio C#](./g-VS/alg16Pierwiastkowanie.webp)
Pełny kod klasy Form formatki aplikacji wykorzystującej algorytm pierwiastkowania
Form1.cs:
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 _16AlgPierwiastekKwad
{
public partial class Form1 : Form
{
float pierwiastek(float n, float dokladnosc)
{
float a = 1.0f,
b = n;
while ((float)Math.Abs(a - b) >= dokladnosc)
{
a = (a + b) / 2;
b = n / a;
}
return (float)(a + b) / 2;
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text.Length < 1 || textBox2.Text.Length < 1)
return;
float n=float.Parse(textBox1.Text),
dokladnosc=float.Parse(textBox2.Text);
MessageBox.Show(
pierwiastek(n, dokladnosc).ToString(),
"Wynik pierwiastkowania",
MessageBoxButtons.OK,
MessageBoxIcon.Information
);
}
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
//zamień kropkę na przecinek (seperator dziesiętny)
//przecinek jest ustawiony jako znak separatora na Polskę
if (e.KeyChar == '.'|| e.KeyChar == ',') { e.KeyChar = ','; return; }
if (e.KeyChar == 8) return;//wyskocz jak BackSpace
//ignoruj nienumeryczne i znak minus
//nie ma pierwiastka kwad z mniejszych od zera
if (e.KeyChar < '0' || e.KeyChar > '9' || e.KeyChar=='-')
e.Handled = true;
}
}
}