using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace laba1 { class Program { public static void output(double[] mas, double[] mas1, double[] maznamen, double[] mas3) { double f, p1, p2; int j = 0; Console.WriteLine("1.по формулi"); Console.WriteLine("2.Лагранж"); Console.WriteLine("3.кубiчна апроксимацiя"); Console.WriteLine("4.1-а похiдна по формулi"); Console.WriteLine("5.1-а похiдна апроксимацiя"); Console.WriteLine("6.2-а похiдна по формулi"); Console.WriteLine("7.2-а похiдна апроксимацiя"); for (double i = 0.12; i < 1.44; i += 0.06) { f = Math.Log(i*i+i+1); //наша функція p1 = (2*i+1)/(i*i+i+1);//1-a похідна p2 = -((2*i*i+2*i-1)/(i*i*i*i+2*i*i*i+3*i*i+2*i+1));//2-a похідна Console.Write("{0:F3} \t", f); Console.Write("{0:F3} \t", mas[j]);//за Лагранжом Console.Write("{0:F3} \t", mas1[j]);//кубічна апроксимація Console.Write("{0:F3} \t", p1);//1 похідна Console.Write("{0:F3} \t", maznamen[j]); Console.Write("{0:F3} \t", p2); Console.WriteLine("{0:F3}", mas3[j]); j++; } } public static double[] koef_lagr(double x, double[] dot_s, double[] f_x)//повертає значення многочлена Лагранжа { double[] koef = new double[10]; for (int i = 0; i < 10; i++) { double chiseln = 1, znamen = 1; for (int j = 0; j < 10; j++) { if (i != j) { chiseln = chiseln * (x - dot_s[j]); znamen = znamen * (dot_s[i] - dot_s[j]); } } koef[i] = f_x[i] * chiseln / znamen; } return koef; } public static double[] Lagranj(double[] dot_s, double[] f_x)//апроксимація за Лагранжом { double[] za = new double[25]; double[] koef = new double[10]; int q = 0; for (double j = 0.12; j < 1.5; j += 0.06) { double s = 0; koef = koef_lagr(j, dot_s, f_x); for (int k = 0; k < 10; k++) s += koef[k]; za[q] = s; q++; } return za; } public static double[] koef_aprocs(double x, double[] dot_s, double[] f_x)//коефіцієнти кубічної апроксимації { double[] koef = new double[4]; int k = 0; for (int i = 0; i < dot_s.Length - 1; i++) { if ((x > dot_s[i]) && (x < dot_s[i + 1])) { switch (i) { case 0: k = 0; break; case 1: k = 0; break; case 2: k = 1; break; case 3: k = 2; break; case 4: k = 3; break; case 5: k = 4; break; case 6: k = 5; break; case 7: k = 6; break; case 8: k = 6; break; case 9: k = 6; break; } break; } } for (int i = 0; i < 4; i++) { double chiseln = 1, znamen = 1; for (int j = 0; j < 4; j++) { if (i != j) { chiseln = chiseln * (x - dot_s[j + k]); znamen = znamen * (dot_s[i + k] - dot_s[j + k]); } } koef[i] = f_x[i + k] * chiseln / znamen; } return koef; } public static double[] Aprocsim(double[] dot_s, double[] f_x)//кубічна апроксимація { double[] za = new double[25]; double[] koef = new double[4]; int q = 0; for (double j = 0.12; j < 1.5; j += 0.06) { double s = 0; koef = koef_aprocs(j, dot_s, f_x); for (int k = 0; k < 4; k++) s += koef[k]; za[q] = s; q++; } return za; } public static double[] pohidna_1(double[] znach2) { double[] za1 = new double[25]; for (int i = 0; i < znach2.Length - 1; i++) { if (i == 0) za1[i] = (znach2[i + 1] - znach2[i]) / 0.06;//крайня 1-а різницева похідна else za1[i] = (znach2[i + 1] - znach2[i - 1]) / 2 / 0.06;//центральна 1-а різницева похідна } return za1; } public static double[] pohidna_2(double[] znach) { double[] z = new double[25]; for (int i = 0; i < znach.Length - 1; i++) { if (i == 0) z[i] = Math.Abs((pohidna_1(znach)[i + 1] - pohidna_1(znach)[i])) / 0.06;//ліва 2-а різницева похідна else if (i + 1 == znach.Length) z[i + 1] = Math.Abs((pohidna_1(znach)[i + 1] - pohidna_1(znach)[i])) / 0.06;//права 2-а різницева похідна else z[i] = Math.Abs((znach[i + 1] + znach[i - 1] - 2 * znach[i])) / 0.06 / 0.06;//центральна 2-а різницева похідна } return z; } static void Main(string[] args) { double[] dot_s = new double[10] { 0.5, 0.69, 0.78, 0.99, 1.21, 1.34, 1.51, 1.63, 1.71, 1.83 }; double[] f_x = new double[10] { 0.55962, 0.77293, 0.87062, 1.0886, 1.30131, 1.41963, 1.566561, 1.66523, 1.72884, 1.82114 }; double[] znach = Lagranj(dot_s, f_x); double[] znach2 = Aprocsim(dot_s, f_x); double[] znach3 = pohidna_1(znach2); double[] znach4 = pohidna_2(znach2); output(znach, znach2, znach3, znach4); Console.ReadKey(); } } }