Решение уравнений (метод дихотомии) на C#

Привет! Сегодня посмотрим, как решать уравнения методом дихотомии (методом половинного деления) на языке программирования C#.
Другие методы решения уравнений на компьютере можете посмотреть в этом разделе.
Пусть есть уравнение f(x)=0. Найдём приближенно корень этого уравнения на отрезке [a, b] с погрешностью ε. В данном диапазоне корень должен быть только один.
Значения f(a) и f(b) должны иметь разные знаки.
Перенесём 2 (двойку) в левую часть уравнения, тогда получим f(x) = x 2 — 2 = 0.
Запрограммируем консольное приложение.
Переменная e — это погрешность, с которой хотим вычислить корень уравнения. Переменные a, b — левая и правая граница отрезка, где ищем ответ. Переменная c — это середина отрезка [a, b].
Длина отрезка должна подходить под заданную точность ε=(b-a)/2 n . Таким образом, мы можем точно вычислить через сколько итераций получим приближённый корень с заданной точностью.
Решение квадратных, кубических и биквадратных уравнений на C#
Выражение вида f(x)=0 называется уравнением. Число х называется корнем уравнения, если при его подстановке уравнение обращается в верное равенство. В статье рассмотрим методы решения уравнений — как точных, так и численных (приближенных).
Решение квадратных уравнений
Квадратным уравнением называется уравнение вида

Классическая формула для нахождения его корней (действительных и комплексных):

где выражение D = b 2 − 4ac называется дискриминантом уравнения, от его значения зависит количество и характер решений:
- Если D>0, то корней уравнения будет два и оба они будут действительными числами;
- Если D=0, то будет лишь один дейсвительный корень уравнения;
- Если D<0, то действительных решений уравнения нет, а корни будут комплексными.
Для нахождения действительных корней напишем метод SolveQuadraticEquation, входными параметрами которого будут значения при коэффициентах a, b и c, а на выходе – набор значений – решений уравнения:
Для работы с комплексными числами в .NET 4.0 был добавлен класс Complex, с помощью которого мы перепишем наш метод для нахождения также и комплексных корней уравнения:
Нужно заметить, что в данном случае возвращаться будет набор значений типа Complex.
Для тестирования написанных функций возьмем следующие три квадратных уравнения:
- 5x 2 +10x+200=0; данное уравнение не имеет действительных корней, но имеет пару сопряженных комплексных корней: x1 = -1-6,2449979983984i, x2 = -1+6,2449979983984i;
- x 2 -8x+16=0; данное уравнение имеет один двукратный корень x1=x2=4;
- x 2 -5x+6=0; данное уравнение имеет два различных корня x1=2, x2=3.
Напишем программу для решения этих уравнений:
На выходе получим:
5x^2 — 10x + 200 = 0
x0 = (-1, -6,2449979983984)
x1 = (-1, 6,2449979983984)
x^2 — 8x + 16 = 0
x0 = (4, 0)
x1 = (4, 0)
x^2 — 5x + 6 = 0
x0 = (3, 0)
x1 = (2, 0)
Воспользуемся WolframAlpha для проверки значений:
Решение кубических уравнений
Кубическим уравнением называется уравнение третьего порядка, которое имеет вид

Кубическое уравнение всегда имеет 3 корня, которые могут быть как вещественными, так и комплексными. Для решения кубических уравнений используется метод Виета-Кардано.
Формулы Кардано и Виета требуют применения специальных функций, и в том случае, когда требуется провести большую серию вычислений корней кубического уравнения с не слишком сильно меняющимися коэффициентами, более быстрым алгоритмом является использование метода Ньютона или других итерационных методов (с нахождением начального приближения по формулам Кардано-Виета), о которых мы поговорим дальше.
Рассмотрим в качестве примера следующие кубические уравнения:
- x^3 — 6x^2 + 11x — 6 = 0
- x^3 — 6x^2 + 11x + 6 = 0
Напишем программу для решения кубических уравнений с помощью метода Виета-Кардано:
Напишем программу для тестирования метода:
x^3 — 6x^2 + 11x — 6 = 0
x0 = (1, 0)
x1 = (3, 0)
x2 = (2, 0)
x^3 — 6x^2 + 11x + 6 = 0
x0 = (-0,434841368216901, 0)
x1 = (3,21742068410845, 1,85643189109788)
x2 = (3,21742068410845, -1,85643189109788)
Решим эти же уравнения с помощью WolframAlpha.
Решение биквадратных уравнений
Биквадратное уравнение — уравнение четвёртой степени вида
ax 4 + bx 2 + c = 0
где a,b,c — заданные комплексные числа и a != 0. Подстановкой y = x 2 сводится к квадратному уравнению относительно y. Такой переход от одной неизвестной величины к другой называется методом замены неизвестных.
Рассмотрим в качестве примера кубические уравнения:
- 5x^4 — 10x^2 + 200 = 0
- x^4 — 8x^2 + 16 = 0
- x^4 — 5x^2 + 6 = 0
Таким образом немного модифицируем первую функцию для решения биквадратных уравнений:
Напшем программу для тестирования метода:
На выходе получим такие результаты:
5x^4 — 10x^2 + 200 = 0
x0 = (1,63164875514566, -1,91370783040891)
x1 = (-1,63164875514566, 1,91370783040891)
x2 = (1,63164875514566, 1,91370783040891)
x3 = (-1,63164875514566, -1,91370783040891)
x^4 — 8x^2 + 16 = 0
x0 = (2, 0)
x1 = (-2, 0)
x2 = (2, 0)
x3 = (-2, 0)
x^4 — 5x^2 + 6 = 0
x0 = (1,73205080756888, 0)
x1 = (-1,73205080756888, 0)
x2 = (1,4142135623731, 0)
x3 = (-1,4142135623731, 0)
Как решить уравнение в c
Для примера рассмотрим задачу решения уравнения 
где угол x задан в градусах. Указанное уравнение можно переписать в виде 
Для графического отсечения корней достаточно построить график функции 
Из рисунка видно, что корень уравнения лежит в промежутке x∈(6;8) .
Аналитическое отделение корней основано на следующих теоремах.
Теорема 1 . Если непрерывная функция f(x) принимает на концах отрезка [a; b] значения разных знаков, т.е. 
то на этом отрезке содержится по крайней мере один корень уравнения.
Теорема 2 . Если непрерывная на отрезке [a; b] функция f(x) принимает на концах отрезка значения разных знаков, а производная f'(x) сохраняет знак внутри указанного отрезка, то внутри отрезка существует единственный корень уравнения f(x) = 0 .
Метод итерации — численный метод решения математических задач, используемый для приближённого решения алгебраических уравнений и систем. Суть метода заключается в нахождении по приближённому значению величины следующего приближения (являющегося более точным). Метод позволяет получить решение с заданной точностью в виде предела последовательности итераций. Характер сходимости и сам факт сходимости метода зависит от выбора начального приближения решения.
Функциональное уравнение может быть записано в виде 
Функцию f(x) называют сжимающим отображением .
Последовательность чисел x0, x1 ,…, xn называется итерационной , если для любого номера n>0 элемент xn выражается через элемент xn-1 по рекуррентной формуле 
а в качестве x0 взято любое число из области задания функции f(x) .
Реализация на C++ для рассмотренного выше примера 
Уравнение может быть записано в форме 
Результат выполнения 
Если известно начальное приближение x0 корня уравнения f(x)=0, то последовательные приближения находят по формуле 
Графическая интерпретация метода касательных имеет вид 
Реализация на C++
Для заданного уравнения 
производная будет иметь вид 
Результат выполнения 
Если x0 , x1 — приближенные значения корня уравнения f(x) = 0 и выполняется условие 
то последующие приближения находят по формуле 
Методом хорд называют также метод, при котором один из концов отрезка закреплен, т.е. вычисление приближения корня уравнения f(x) = 0 производят по формулам: 
Геометрическая интерпретация метода хорд: 
Реализация на C++
В отличие от двух рассмотренных выше методов, метод хорд предполагает наличие двух начальных приближений, представляющих собой концы отрезка, внутри которого располагается искомый корень.
Результат выполнения 
Если x0 , x1 — приближенные значения корня уравнения f(x) = 0 и выполняется условие 
то последующие приближения находятся по формуле 
и вычисляется f(xi) . Если f(xi)=0 , то корень найден. В противном случае из отрезков выбирается тот, на концах которого f(x) принимает значения разных знаков, и проделывается аналогичная операция. Процесс продолжается до получения требуемой точности.
Геометрическая интерпретация метода дихотомии 
Реализация на C++
Результат выполнения 
Для численного поиска решения также можно использовать генетические алгоритмы.
Программирование на C, C# и Java
Решение квадратного уравнения на С# в Windows Forms.
Формула нахождения дискриминанта: ![]()
Формула нахождения корней выражения, если дискриминант больше нуля: ![]()
И формула нахождения одного корня выражения, если дискриминант равен нулю: ![]()
Ну и, пожалуй, стоит вспомнить сам вид квадратного выражения: ![]()
Программа для решения квадратных уравнений на C++
Довольно часто в пособиях по программированию встречаются задания по нахождению решений каких-нибудь математических уравнений. Задача нахождения корней квадратного уравнения — это довольно тривиальная задача, как и многие другие задачи. Решается она очень просто при помощи листа бумаги и ручки, но решение можно автоматизировать посредством написания прикладной программы и её использования. В этой статье мы напишем такую программу.
Алгоритм решения квадратного уравнения
Многие знают, что уравнение вида ax 2 + bx + c = 0 , где a не равно 0, называют квадратным уравнением.
Существуют различные способы решения квадратных уравнений, но мы рассмотрим решение через дискриминант.
Обозначается дискриминант буквой D . Из школьного курса знаем, что D = b 2 — 4ac .
Существует несколько условий:
- Если D > 0, то решение имеет 2 различных вещественных корня.
- Если D = 0, то оба вещественных корня равны.
- Если D < 0, то оба корня являются комплексными числами.
Алгоритм решения довольно прост. Вычисляется дискриминант, если он больше или равен 0, то вычисляются корни по следующей формуле

Формула нахождения корней квадратного уравнения
Также можно объединить две предыдущие формулы в одну

Объединенная формула нахождения корней квадратного уравнения
Алгоритм решения квадратного уравнения на C++
Для написания программы, решающей квадратное уравнение, мы прибегнем к тому же алгоритму, но реализуем его на языке программирования C++.
Определимся с переменными. Нам понадобиться всего 4 переменных a, b, x, c. Корни и коэффициенты всегда вещественного типа, поэтому переменные a, b, x, c будут иметь тип double.
Определимся интерфейсом. Пользователь будет вводить в консоль значения для для переменных a, b, c, а после получать на вывод корни уравнения, либо сообщение «Дискриминант меньше 0, корни невещественные.»
Итак, определим в программе в функции main() наши переменные
Вывод и ввод будет осуществляться с консоли, поэтому подключаем заголовок #include <iostream> для ввода\вывода в консоли, #include <cmath> для работы с математическими функциями и область using namespace std;
Просим пользователя ввести значения переменных и сохраняем каждое значение
Проверяем условие, если дискриминант больше или равен 0, то находим корни и выводим
в противном случае выводим сообщение
На этом всё, осталось скомпилировать, запустить и проверить. Запускаем и вводим данные, чтобы D был меньше 0
В этом случае D = 3*3 — 4*2*3 = -15, а это меньше 0, значит ответ программа дала верный.
Ответы тоже верны. Программа работает правильно.
Ниже представлен весь листинг программы для нахождения корней квадратного уравнения на C++
Для вас это может быть интересно:
Программа для решения квадратных уравнений на C++ : 24 комментария
Программировать так сложно…
- Nicknixer Автор записи 15.10.2016
Не так сложно, как Вам кажется! Немного литературы, немного практики и смотреть на код решения такой задачи Вы будете по-другому.
Доброго времени суток! Помогите пожалуйста написать программу, которая считает сколько символов в ряде двумерного массива. То есть , например массив 5 на 5, сколько символов в 1 ряде, сколько во 2 и т.д.
Ответил вам по электронной почте
Критику принимаете?
Программа дырявая как сито.
Если число очень маленькое, но положительное, например 10^(-20) — у вас будет переполнение или типо того. Оператор > проверяет знак числа (это отдельный бит), а оператор == для дробных чисел не имеет смысла, т.к. в младших разрядах числа обычно находится какой-нибудь мусор, который при таком сравнении дает false.
x = ( -1*b + sqrt(b*b — 4*a*c) ) / (2 * a);
x = ( -1*b — sqrt(b*b — 4*a*c) ) / (2 * a);
Тут есть три вопроса:
1) зачем два раза вычислять одно и тоже (я про корень)
2) что делать если мне корни надо как-то использовать, а не просто вывести (тут есть проблема, ведь у меня то один корень — то два). Чтобы лучше понять в чем проблема — попробуйте вынести вычисление корней в отдельную функцию. У вас то вообще, если корень один — то их выведется все равно два, одинаковых.
3) в переменной «a» может быть ноль (или близкое к нулю число) — при этом мы получим деление на ноль (а точнее, переполнение).
Но это ведь еще не все. Что будет если и «a» и «b» равны нулю? — тебе надо рассмотреть два варианта — если c = 0 (условно, близко к нулю), то корней бесконечно много. А если c != 0, то корней нет.
Вообще, эта задача — прекрасный пример для юнит-тестирования и демонстрации принципов разработки через тестирование. Именно его я рассматривал в своей статье по теме тестирования: Юнит-тестирование. Пример. Boost Unit Test. Дело в том, что тут куча вариантов сделать ошибку, при этом их понимание приходит не сразу, т.е. школьник решая задачу напишет по формуле которой учили (ну и вот как у вас). А потом надо разбираться и смотреть как программа может сломаться, при этом разрабатывать тесты.
- Николай Сергейчук Автор записи 09.02.2017
Принимаем
Согласен с вами во всём! Программу можно реализовать намного лучше, используя различные проверки и валидацию входных данных.
Однако, статья рассчитана на аудиторию, которая только начинает познавать программирование или делает лабораторную. Чтобы людям легче было понять, реализация данной программы упрощена до невозможности. И, возможно, несправедливо было с моей стороны не предупредить их о возможных ошибках в работе программы, которые могут вскрыться позже, если подать на вход определенные значения.
Кстати, у вас интересная статья по тестированию!
Николай, доброго времени суток! Можете помочь с написанием програмки в с++? 1-1/2!+1/3!-1/4!+1/5! и так до 1/100! ? Чтобы при заднии в строке номера члена последовательности выдавал сумму до него по такой вот формуле? Буду очень благодарен!
Пожалуйста подскажите как ввести экран правильный ответ дискриминанта
Помогите решить в Dev C++
Sqrt x^2+1+sqrt|x|,x0
Здравствуйте, можете помочь с решением биквадратного и триквадратного уравнения?
#include
using namespace std;
int main()
<
/*Решение квадратных уравнений*/
setlocale(0, «»);
cout << "Квадратное уравнение." << '\n';
double a;
double b;
double c;
double D;
double x;
double x1;
double x2;
cout <> a;
cout <> b;
cout <> c;
D = pow(b, 2) — 4 * a * c;
cout << "Дискриминант равен: " << D < 0) <
cout << "Уравнение содержит два корня. " << '\n';
x1 = (-b + sqrt(D)) / 2 * a;
cout << "Первый корень равен: " << x1 << '\n';
x2 = (-b — sqrt(D)) / 2 * a;
cout << "Второй корень равен: " << x2 << '\n';
>
if ((D) == 0) <
cout << "Уравнение содержит один корень. " << '\n';
x = -b / 2 * a;
cout << "Корень равен: " << x << '\n';
>
if ((D) < 0) <
cout << "Уравнение не имеет корней. " << '\n';
>
system("pause");
return 0;
>
ну и? если даже тупо скопировать код и вставить его в cpp.sh , ничего не работает. поебота какая то этот с++
Уважаемая, Лена! Я, надеюсь, вы знаете, что код программы, написанной на языке программирования C++ нельзя тупо вставить в блокнот и сохранить под названием «cpp.sh»? Если не знали, то я, видимо, открыл для вас Америку!
iconcerts где забыл
#include
Я ради интереса написал программу нахождения корней квадратного уравнения на С++, с выводом корней как в десятичном виде, так и в виде простой дроби (причём уже сокращённой), потому что выводя корни в десятичном виде программа их одновременно сокращает и округляет и 1/3 превращается в 0.333333 хотя на самом деле 0.333333 (3), то есть для проверки правильно ли нашёл корни ваш ребёнок, вы с получите что-то типа: X1= 0.285714; X2=0.214286, а на самом деле это будет X1=2/7; X2=3/14, кроме того, если корень из дискриминанта не получается целым числом, вы уже получите двойную неточность: сначала при извлечении корня программа отсечёт значение до 4-6 цифр после запятой с округлением, а затем сделает то же самое при делении числителя на знаменатель. Я и здесь сделал вывод корней в двух значениях: в десятичном и в виде выражения X1= (-b + sqrt(D))/(2*a); X2= (-b — sqrt(D))/(2*a), то есть выводится примерно вот так X1=-5+sqrt(21)/2; X2=-5-sqrt(21)/2 с одновременным разложением дискриминанта под корнем на множители, вынесением этих множителей из-под корня, если они выносятся нацело, их перемножением и дальнейшим сокращением. Вот, например, имеем a=3, b=15, c=3, при решении получаем D=189 программа выдаёт десятичные корни X1= -0.208712 и X2= -4.79129, а в виде выражения имеем: X1= -5+sqrt(21)/2, то есть первоначально получаем: X1= -15+sqrt(189)/6, -> 189=21*9 -> -15+3sqrt(21)/6 далее идёт сокращение на 3 и итог -5+sqrt(21)/2
День добрый.
Недавно начал изучать C++. Решил попробовать написать решение квадратного уравнения именно через оператор вида «условие ? выполняется : не выполняется». Т.е. если условие выполняется, то имеем два решения (даже если d = 0, то тоже должно быть два решения x1 = x2), если d < 0, то просто выводится "нет решения", но компилятор выдает, что что-то не так со вторым условием. Подскажите пожалуйста, что именно. Спасибо.
int main()
<
double a, b, c, d, xfst, xscd;
std::cout <> a;
std::cout <> b;
std::cout <> c;
d = pow(b, 2) — 4 * a*c;
d >= 0 ? xfst = ((-b + sqrt(d)) / double(2 * a)) , xscd = ((-b — sqrt(d)) / double(2 * a)) : std::cout << "no solution";
std::cout << "x1 = " << xfst << "" << std::endl;
std::cout << "x2 = " << xscd << "" << std::endl;
return 0;
- Николай Сергейчук Автор записи 12.02.2020
if (d >= 0) <
xfst = ((-b + sqrt(d)) / double(2 * a));
xscd = ((-b — sqrt(d)) / double(2 * a));
std::cout
Создать программу для решения квадратного уравнения.
У меня не получаеться, но и копифейсом я не хочу заниматься.
Прошу помогите. Заранее спасибо.
Здравствуйте! Как решить эту задачу? Приведенный пример сверху не подходит .
Давайте напишем действительно полезную программу! Вы наверняка уже устали считать дискриминант для квадратных уравнений? Давайте автоматизируем этот процесс.
На вход программы подаются три целых числа — коэффициенты уравнения ax^2 + bx + c = 0ax
2
+bx+c=0
Гарантируется, что a \neq 0a
=0.
Выведите через пробел корни уравнения в порядке убывания и округленные «вниз». Если уравнение имеет корень кратности 2 — выведите одно число. Если у уравнения нет действительных корней — выведите «NO»
Для извлечения корней используйте функцию sqrt. Она содержится в библиотеке сmath ( она уже импортирована в коде ). Для округления воспользуйтесь функцией floor ( из той же библиотеки ).
1 0 -4
Sample Output 1:
2 -2
Sample Input 2:
1 2 2
Sample Output 2:
Пожалуйста подскажите как ввести экран ответ дискриминанта
Пожалуйста подскажите как ввести на екран ответь дискриминанта
Подскажите как правильно решить?
Обчислити z = (x1 + y1) / (x2 + y2), де х1, х2 — коренi рiвняння 2х^2 + x — 4 =0.
y1, y2 — коренi рiвняння ay^2 + 2y — 1 = 0. Усi коренi дiйснi.
using namespace std;
int main() <
double a = 2, b, c = -4;
int x1, x2;
double a1, b1 = 2, c1 = -1;
int y1, y2;
float z;
if((b*b — 4*a*c) >= 0 ) <
x1 = ( -1*b + sqrt(b*b — 4*a*c)) / (2 * a);
cout << "Первый корень равен = " << x1 << endl;
x2 = ( -1*b — sqrt(b*b — 4*a*c)) / (2 * a);
cout << "Второй корень равен = " << x2 << endl;
>
else <
cout << "Дискриминант меньше 0, корни невещественные." << endl;
>
if((b1*b1 — 4*a1*c1) >= 0) <
y1 = ( -1*b1 + sqrt(b1*b1 — 4*a1*c1)) / (2 * a1);
cout << "Первый корень равен = " << y1 << endl;
y2 = ( -1*b1 — sqrt(b1*b1 — 4*a1*c1)) / (2 * a1);
cout << "Второй корень равен = " << y2 << endl;
>
else <
cout << "Дискриминант меньше 0, корни невещественные." <= 0, x2 >= 0, y1 >= 0, y2 >= 0) <
z = (x1 + y1)/(x2 +y2);
cout << "Решение " << z << endl;
>
else <
cout << "Нет решения!" << endl;
>
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.