Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.IO;
- namespace Nonlinear_Interval {
- class Program {
- static float a_func(float x) {
- return (float)Math.Pow(x, 3) + 3 * x + 1;
- }
- static float test_function(float x) {
- return (float)Math.Tan(0.4 * x + 0.4) - (float)Math.Pow(x,2);
- }
- static float b_func(float x) {
- return x + (float)Math.Log(x, 10) - 0.5F;
- }
- //Метод Половинного Деления
- static void HalfDivision(int a, int b) {
- //массив для ответов
- string[] lines = new string[20];
- //счётчик корней
- int count = 1;
- //шаг
- float h = 0.003F;
- //сохранение предыщего значения x
- float prevF = 0;
- //индекс массива result
- int i = 0;
- //точность
- double eps = 0.0001;
- //переменные для f(a), f(b), f(x)
- float fa = 0, fb = 0, fx = 0;
- //вычисление длины массива
- int len = (int)((Math.Abs(a) + (float)b) / h);
- //массив хранения f(x) в локализации
- float[] result = new float[len+1];
- //локализуем и сразу считаем
- for(float f = a; f<=b; f += h, i++) {
- //вычисляем знаечение f(x)
- result[i] = test_function(f);
- //если дошли до второго f(x)
- if (i > 0) {
- //если знак поменялся или одно из f(x) равно нулю
- if (result[i] * result[i-1] < 0 || result[i] == 0 || result[i-1] == 0) {
- //перезаписываем предыдущее заначение x
- float A = prevF;
- //перезаписываем текущее заначение x
- float B = f;
- //вычисляем x для уточнения корней
- float x = (A + B) / 2;
- //вычисляем расстояние между точками
- float check = Math.Abs(A - B);
- //счиатем пока расстояние между точками
- //больше заданной точности
- while (check > eps) {
- //вычисляем f(a)
- fa = test_function(A);
- //вычисляем f(b)
- fb = test_function(B);
- //вычисляем f(x)
- fx = test_function(x);
- //если знак f(x) изменился
- //то сдвиагем границу
- A = fx * fa > 0 ? x : B = x;
- //вычисляем новое значение x
- x = (A + B) / 2;
- //вычисляем расстояние между точками
- check = Math.Abs(A - B);
- }
- Console.WriteLine($"x{count}: " + x);
- lines[count - 1] = Convert.ToString(x);
- count++;
- }
- }
- prevF = f;
- }
- //путь для ответа
- string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
- //запись ответа в файл
- File.WriteAllLines($"{AnswerPath}", lines);
- Console.WriteLine("Результат работы программы записан в файл");
- }
- //Метод Хорд
- static void Chord(int a, int b) {
- //массив для ответов
- string[] lines = new string[20];
- //счётчик корней
- int count = 1;
- //шаг
- float h = 0.003F;
- //сохранение предыщего значения x
- float prevF = 0;
- //индекс массива result
- int i = 0;
- //точность
- double eps = 0.00001;
- //переменные для f(a), f(b), f(x)
- float fa = 0, fb = 0, fx = 0;
- //вычисление длины массива
- int len = (int)((Math.Abs(a) + (float)b) / h);
- //массив хранения f(x) в локализации
- float[] result = new float[len + 1];
- //локализуем и сразу считаем
- for (float f = a; f <= b; f += h, i++) {
- //вычисляем знаечение f(x)
- result[i] = test_function(f);
- //если дошли до второго f(x)
- if (i > 0) {
- //если знак поменялся или одно из f(x) равно нулю
- if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
- //перезаписываем предыдущее заначение x
- float A = prevF;
- //перезаписываем текущее заначение x
- float B = f;
- //вычисляем f(a)
- fa = test_function(A);
- //вычисляем f(b)
- fb = test_function(B);
- //вычисляем x для уточнения корней
- float x = (float)(A - (B - A) / (fb - fa)*fa);
- //вычисляем расстояние между точками
- float check = Math.Abs(A - B);
- //счиатем пока расстояние между точками
- //больше заданной точности
- while (check > eps) {
- //вычисляем f(a)
- fa = test_function(A);
- //вычисляем f(b)
- fb = test_function(B);
- //вычисляем f(x)
- fx = test_function(x);
- //если знак f(x) изменился
- //то сдвиагем границу
- A = fx * fa > 0 ? x : B = x;
- //вычисляем новое значение x
- x = (float)(A - (B - A) / (fb - fa) * fa);
- //вычисляем расстояние между точками
- check = Math.Abs(A - B);
- }
- Console.WriteLine($"x{count}: " + x);
- lines[count - 1] = Convert.ToString(x);
- count++;
- }
- }
- prevF = f;
- }
- //путь для ответа
- string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
- //запись ответа в файл
- File.WriteAllLines($"{AnswerPath}", lines);
- Console.WriteLine("Результат работы программы записан в файл");
- }
- //Метод Золотого Сечения
- static void GoldenRatio(int a, int b) {
- //массив для ответов
- string[] lines = new string[20];
- //Константа Фидия
- float Ф = 1.618F;
- //счётчик корней
- int count = 1;
- //шаг, вычисленный при помощи
- //специальных методов
- float h = 0.003F;
- //сохранение предыщего значения x
- float prevF = 0;
- //индекс массива result
- int i = 0;
- //точность
- double eps = 0.00001;
- //переменные для f(a), f(b), f(x)
- float fa = 0, fb = 0, fx1 = 0, fx2 = 0;
- //вычисление длины массива
- int len = (int)((Math.Abs(a) + (float)b) / h);
- //массив хранения f(x) в локализации
- float[] result = new float[len + 1];
- //локализуем и сразу считаем
- for (float f = a; f <= b; f += h, i++) {
- //вычисляем знаечение f(x)
- result[i] = test_function(f);
- //если дошли до второго f(x)
- if (i > 0) {
- //если знак поменялся или одно из f(x) равно нулю
- if (result[i] * result[i - 1] < 0 || result[i] == 0 || result[i - 1] == 0) {
- //перезаписываем предыдущее заначение x
- float A = prevF;
- //перезаписываем текущее заначение x
- float B = f;
- //вычисляем f(a)
- fa = test_function(A);
- //вычисляем f(b)
- fb = test_function(B);
- //вычисляем x для уточнения корней
- float x1 = B - (B - A) / Ф;
- float x2 = A + (B - A) / Ф;
- //вычисляем расстояние между точками
- float check = Math.Abs(A - B);
- //счиатем пока расстояние между точками
- //больше заданной точности
- while (check > eps) {
- //вычисляем f(a)
- fa = test_function(A);
- //вычисляем f(b)
- fb = test_function(B);
- //вычисляем f(x1)
- fx1 = test_function(x1);
- //вычисляем f(x2)
- fx2 = test_function(x2);
- //если знак f(x) изменился
- //то сдвиагем границу
- if (x1 > x2)
- A = fx1 * fa > 0 ? x1 : B = x1;
- else
- A = fx2 * fa > 0 ? x2 : B = x2;
- //вычисляем новые значения x
- x1 = B - (B - A) / Ф;
- x2 = A + (B - A) / Ф;
- //вычисляем расстояние между точками
- check = Math.Abs(A - B);
- }
- float x = (x1 + x2) / 2;
- Console.WriteLine($"x{count}: " + x);
- lines[count - 1] = Convert.ToString(x);
- count++;
- }
- }
- prevF = f;
- }
- //путь для ответа
- string AnswerPath = Environment.CurrentDirectory + @"\output.txt";
- //запись ответа в файл
- File.WriteAllLines($"{AnswerPath}", lines);
- Console.WriteLine("Результат работы программы записан в файл");
- }
- static void Main(string[] args) {
- int a = -10, b = -a;
- HalfDivision(a,b);
- Console.WriteLine();
- Chord(a, b);
- Console.WriteLine();
- GoldenRatio(a, b);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement