GIẢI ĐA THỨC BẬC N 1.Trình bày thuật toán:
Input: Đa thức bậc n có dạng a0xn + a1xn-1 + …… + an-1x + an = 0 (a0 ≠ 0) và sai
số ε cho trước
Output: Nghiệm của đa thức bậc n
Các phương pháp:
• Phương pháp tiếp tuyến để tìm nghiệm bởi tiếp không cần chọn đúng x0 vẫn thực hiện được
• Hoocne tìm đa thức mới không chứa nghiệm của đa thức cũ => bậc đa thức mới giảm 1 bậc so với đa thức cũ
Tóm tắt thuật toán:
Bước 1: Kiểm tra bậc đa thức n=1 thông báo nghiệm x = - a1
a0 và STOP
Bước 2: Chọn x0 = 0 Nếu f’(x0) = 0 thì x0 := x0 + c ,(c = hằng số tùy ý)
Bước 3: Thực hiện 9999 vòng lặp để tính:
xn = xn-1 - f(xn-1)
f'(xn-1) ,n=1,2,… ,9999 Nếu |f(x9999)>0| => Vô nghiệm => STOP
Nếu |xn-xn-1|< ε thì x = xn là 1 nghiệm đa thức và thông báo nghiệm => Chuyển sang Bước 4
Bước 4: Sử dụng Hoocne để tách được đa thức mới không chứa nghiệm vừa tìm được, bậc giảm 1 so với đa thức cũ
Hệ số của đa thức mới:
ai = ai + ai-1x , i=1,…,n-1
Quay lại Bước 1;
Trang 2Code:
using System;
namespace Giai_phuong_trinh_bac_n
{
class Program
{
static double[] a = new double[1000]; static int n,KL;
static double f(double x)
{
double p = 0;
for(int i=0;i<=n ;i++ )
{
p = p * x + a[i];
}
return p;
}
static double fdh(double x)
{
double p = 0;
int m;
m = n;
for(int i=0;i<=n-1 ;i++ )
{
p = p * x + m * a[i];
m = m - 1;
}
return p;
}
static double GiaiNghiem(double x)
{
double xs = 0;
int start,finish;
start = 0;
finish = 10000;
if (n == 1)
{
if (a[0]!=0) return -a[1] / a[0]; else return KL = 1;
}
while (fdh(x)==0)
{
x = x + 0.76543;
}
Trang 3while (start<finish)
{
if (start==(finish-1))
if (Math.Abs(f(x)) > 0.1) KL = 1;
xs = x;
x = x - (f(x) / fdh(x));
if (Math.Abs(x-xs) < 0.000000001) return x;
start++;
}
return x;
}
static void chiadathuc(double x)
{
for(int i=1;i<n;i++)
{
a[i] = a[i] + a[i-1] * x;
}
n=n-1;
}
static void Main(string[] args)
{
double x;
int T = 0;
do
{
Console.Write("Giai da thuc bac n voi (n>0), nhap n=
");
n = Int32.Parse(Console.ReadLine());
}
while (n <= 0);
Console.WriteLine("\nNhap cac he so:");
do
{
Console.Write("x^{0} (Khac 0) = ", n);
a[0] = Double.Parse(Console.ReadLine());
} while (a[0] == 0);
for(int i=1;i<=n;i++)
{
Console.Write("x^{0} = ", n - i);
a[i] = Double.Parse(Console.ReadLine());
}
while(n>0)
{
x = GiaiNghiem(0);
Trang 4if (KL == 1){if(T==0) Console.WriteLine("PT vo
if (T == 0) Console.WriteLine("\nPhuong trinh co nghiem la:");
Console.WriteLine("X= {0}", x);
chiadathuc(x);
T = 1;
}
Console.ReadKey();
}
}
}