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