using System;
using System.Collections.Generic;
namespace AllRoots
{
class Program
{
static double[] polynomial={ -7, 15, -9, 1 };//x^3-9x^2+15x-7
//static double[] polynomial = { 4,-7,2,1 };// x^3 + 2x^2 − 7^x + 4
static double[] diffarray = { 0,0,0,0};
public static int size = polynomial.Length;
static List<double> roots = new List<double>();
public static void Newton()
{
double p = 900, pi, f, e;
double TOL = 0.001;
pi = 0.9;
for (int i = 0; i < 1000; i++)
{
Console.WriteLine(pi + " " + function(pi) + " " + fdiff(1, pi) + " " + (pi - (function(pi) / fdiff(1, pi))));
p = pi - (function(pi) / fdiff(1, pi));
// e = ((p - pi) / p) * 100;
if (Math.Abs(p) <= TOL)
{
Console.WriteLine("the solution is " + p);
break;
}
pi = p;
}
Console.WriteLine("p " + p);
}
public static double secantfun()
{
double val1 = 0.235;
// Console.WriteLine("**************Secant*****************");
double p2 = val1, p1 = function(p2), pn;
double tol = 0.000001;
double q1 = function(p1);
double q2 = function(p2);
for (int i = 0; i < 100000; i++)
{
pn = p1 - ((function(p1) * (p2 - p1)) / (q2 - q1));
// Console.WriteLine(pn);
double fn = function(pn);
if (fn < 0) fn = -fn;
if (fn < 0.000009 || function(pn) == 0)
{
// Console.WriteLine("root is" + pn);
return pn;
}
p1 = p2;
q1 = q2;
p2 = pn;
q2 = function(pn);
}
return -100;
}
public static double function(double x)
{
double fvalue = 0;
for (int i = 0; i < polynomial.Length; i++)
{
fvalue += polynomial[i] * Math.Pow(x, i);
}
return fvalue;
}
public static double fdiff(int i, double x)
{
double dfiffvalue = 0;
for (int iteration = 0; iteration < i; iteration++)
{
for (int j = 1; j < polynomial.Length; j++)
{
diffarray[j - 1] = j * polynomial[j];
}
}
for (int k = 0; k < diffarray.Length - i; k++)
{
dfiffvalue += diffarray[k] * Math.Pow(x, k);
}
return dfiffvalue;
}
public static double multiplicity(double root)
{
double result = -1, multiplicity = 0;
for (int i = 1; i < 10; i++)
{
result = fdiff(i, root);
if (result == 0)
multiplicity++;
else break;
}
return multiplicity;
}
public static void rooteliminating(double root)
{
double[] array = new double[polynomial.Length];
for (int i = 0; i < polynomial.Length; i++)
{
array[i] = polynomial[polynomial.Length-1 - i];
}
for (int i = 1; i < array.Length; i++)
{
array[i] = root * array[i - 1] + array[i];
}
Array.Reverse(array);
for (int i = 0; i < polynomial.Length; i++)
{
polynomial[i] = 0;
}
for (int i = 1; i < polynomial.Length; i++)
{
polynomial[i - 1] = array[i];
}
size = size - 1;
}
static void Main(string[] args)
{
double root = 34, multi;
while(size>1)
{
root = Math.Round(secantfun(), 2);
Console.WriteLine("Root found is: " + root);
multi = multiplicity(root)+1;
Console.WriteLine("Root: " + root + " is repeated for " + multi + " time");
rooteliminating(root);
for (int i = 0; i <multi; i++)
{
roots.Add(root);
}
for (int i = 1; i <multi; i++)
{
rooteliminating(root);
}
}
Console.WriteLine("Polynomial size is"+size);
Console.WriteLine("Root array is: ");
foreach (var item in roots)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
}
}This program use polynomial array as equation find it first root check its multiplicity(How many time root is repeated ).then eliminate root using synthetic division.change form of equitation and the repeat it again and again unless are roots are found.
