Программа решающая уравнения с одной переменной

ВВЕДЕНИЕ

В данный момент существует много программ для решения уравнений, вычисления интегралов и дифференциалов: MathCAD, MATLAB, и т.д. Они имеют высокую точность вычисления, высокую функциональность, но имеют и свои недостатки. Главные из них – сложный непонятный интерфейс, высокая многофункциональность недоступна рядовому пользователю.

Рынок нуждается в более простых аналогах приведенных выше программ. Созданный программный продукт способен решать уравнения с одной переменной методом Ньютона (касательных). Он прост в эксплуатации, имеет интуитивно понятный интерфейс и способен выстраивать график уравнения, что является очень важным для пользователя.

Программа будет полезна всем, как студентам высших учебных заведений, так и школьникам.

1. ПОСТАНОВКА ЗАДАЧИ

Цель создания программного продукта

Главной целью работы является разработка программы способной решать уравнения с одной переменной методом Ньютона (касательных), что должно являться пособием для студентов высших учебных заведений и для учащихся математических классов среднеобразовательных школ в снижении ненужной нагрузки, связанной с многочисленными массивами вычислений.

1.2. Постановка задачи

В данном программном продукте необходимо реализовать решение двух видов уравнений: y(x) =a×ln(b×x), y(x) =ax2+bx+c. Вместо коэффициентов должны использоваться параметры a, b, c, которые принимают значения, вводимые пользователем. Для нахождения корней, обязательным является указание промежутков, на которых определена функция, поэтому пользователь обязательно вводит промежутки функции m, n. Метод Ньютона является итерационным методом, следовательно, должна указываться погрешность вычисления ε. Обязательным является построение графика выбранной функции на заданном промежутке.

2. МАТЕМЕТИЧЕСКАЯ МОДЕЛЬ

Дисциплина «Численные методы» содержит набор методов и алгоритмов приближенного (численного) решения разнообразных математических задач, для которых точное аналитическое решение либо не существует, либо слишком сложно для использования на практике. При численном решении задач всегда возникает погрешность.

Выделяют абсолютную и относительную погрешность. Пусть р – точное значение искомого ответа, а p – приближённое значение, полученное с помощью численного метода.

Тогда – абсолютная погрешность,

На первом этапе необходимо найти отрезок [a,b], на котором функция имеет ровно один корень. На втором этапе происходит уточнение корня на отрезке с заданной точностью с помощью одного из численных методов.

Метод, реализуемый в РУОП, называется методом Ньютона. Другое название метода – метод касательных.

где f(x) C» [m,n], f(m) f(n) x

Графическая иллюстрация метода приведена на рисунке 2.1. Начальная точка в этом случае совпадает с n.

Рисунок 2.1. – Метод Ньютона

Идея метода заключается в том, что последовательность приближений к корню строится путем проведения касательных к графику функции и нахождения их точек пересечения с осью ОХ.

Шаг 1. Найти первое приближение к корню x0 по формуле (2.2).

Шаг 2. Находить следующие приближения к корню по формуле (2.1), пока не выполнится условия окончания:

Рисунок 3.2. – Корень уравнения

Точка ξ, для которой выполняется ξ= φ(ξ), называется неподвижной точкой процесса итераций. Очевидно, что эта точка является корнем уравнения f(x) =0.

Константа С подбирается таким образом, чтобы функция φ(x) удовлетворяла условиям сходимости метода итераций:

1) – является непрерывной и дифференцируемой на [m,n] ;

Если , то С нужно выбирать так, чтобы и для .

Метод состоит в построении последовательности приближений к корню. В качестве начального приближения выбирается любая точка x0 [a,b]. Для определенности можно брать середину отрезка [a,b]. В качестве формулы получения последующих приближений выступает сама φ(x):

Шаг 1. Найти первое приближение к корню x0 как середину отрезка [m,n].

Шаг 2. Находить следующие приближения к корню по формуле, пока не выполнится условия окончания:

|xi — xi+1| Подсказки при вводе данных

Сообщение об ошибке ввода

вывода результатов на экран

Варианты сохранения результатов

Значение корня уравнения

Рисунок 5.1 – Схема информационных потоков

Блок построения графика

Блок помощи и справочной информации

Файл справочной информации

Помощь и справочная информация

Блок выхода из программы

Рисунок 5.1 – Схема информационных потоков (продолжение)

– Данные, ввидение которых возможно

как из файлов, расположенных на

жёстком диске, так и с клавиатуры;

–Данные, выводимые на экран;

Данные, вводимые из файла.

5.2. Описание функционирования программы

При запуске программы на экране появляется титульный лист, отображающий информацию о студенте; далее загружается меню программы, состоящее из пяти пунктов:

y ( x )= a * ln ( b * x )

Рисунок 5.2 – Схема функционирования программы

– y ( x ) = a * ln ( b * x )

Пункт «Справка» включает в себя информацию о методе Ньютона. Пункты «y(x) =a*ln(b*x)» и «y(x) =a*x^2+b*x+c» представляют собой решения уравнений, где задаются промежутки m и n, параметры a, b(, c), погрешность E и выполняется сохранение в файлы. Пункт «Построение графика» строит график выбранного уравнения в зависимости от введённых параметров и промежутков. Пункт «Выход» – выход из программы. Схема функционирования представлена на рисунке 5.2.

5.3. Описание процедур и функций программы

Procedure title () – выводит титульную страницу на экран монитора;

Procedure graphica () – инициализирует графику.

Procedure pro () – содержит в себе переменную р, которая отвечает за номер выделяемой кнопки, передаётся как параметр в procedure key (p) и в procedure eat (p, bool), а также содержит в себе переменную bool, отвечающую за цикл в рамках procedure pro, передаётся как параметр в procedure eat (p2, bool);

Procedure eat (p2: byte; var bool: boolean) – в зависимости от параметра p2 выполняет один из пяти вариантов дальнейших действий программы. Переменная bool передаётся как параметр обратно в procedure pro;

Procedure key (p1: byte) – выстраивает графическую картинку меню в зависимости от параметра р1;

Procedure equation_1 () – решение уравнения вида y(x) =a×ln(b×x). Переменная Е (погрешность) принимается как параметр из procedure load_file_3 (E), передаёт переменную Е как параметр в procedure save_file (E);

Procedure equation_2 () – решение уравнения вида y(x) =a×x2+b×x+c. Переменная Е (погрешность) принимается как параметр из procedure load_file_3 (E), переменная Е передаётся как параметр в procedure save_file (E);

Procedure load_file_1 () – загружает переменные m и n (промежутки функции) из файла, либо обеспечивает их ввод с клавиатуры, в зависимости от желания пользователя. m, n – глобальные переменные в рамках программы;

Procedure load_file_2 () – загружает переменные a и b либо a, b, c (в зависимости от вида функции) (коэффициенты уравнения) из файла, либо обеспечивает их ввод с клавиатуры, в зависимости от желания пользователя. a, b, c – глобальные переменные в рамках программы;

Procedure load_file_3 (var E: real) – загружает переменную Е (погрешность функции) из файла, либо обеспечивает их ввод с клавиатуры, в зависимости от желания пользователя. Е передаётся как параметр и принимается как переменная в procedure equation_1 и equation_2;

Procedure save_file (E: real) – сохраняет переменные a, b, (c,) m, n – глобальные в рамках программы в файлы либо не сохраняет, сохраняет переменную Е в виде параметра в файл, либо не сохраняет;

Procedure groffunc () – выстраивает график по значениям глобальных в рамках программы переменных a, b, (c,) m, n, с отмеченными на оси х приближениями и корнем уравнения. Содержит в себе function f (x: real): real, высчитывающую значение одной из функций в зависимости от аргумента х. Переменные у0 (масштаб) и у2 (максимальное значение функции) передаются в виде параметров в procedure setka (y0, y2);

Procedure setka (yn: integer; y2: real) – выстраивает координатную сетку и оцифровку осей x и y в зависимости от глобальных в рамках программы переменных m, n и параметров yn и y2;

Procedure help () – предоставляет пользователю непосредственную методологическую помощь.

5.4. Схема взаимодействия процедур программы

Для наглядности работы подпрограмм программы необходимо изобразить в виде схемы их взаимодействие между собой. Взаимодействие подпрограмм изображено на рисунке 5.3.

procedure eat (p2 : integer; var bool : boolean);

Procedure save_file (E : real);

load_file_3 (var E : real);

procedure setka (yn: integer; y2 : real);

Рисунок 5.3 – Взаимодействие процедур программы

– запуск процедуры на которую указывает стрелка, из процедуры из которой она исходит.

5.5. Перечень обозначений


5.5.1 Обозначения вводимых данных

m, n – промежутки функции;

a, b, c – коэффициенты уравнения, представленные в виде параметров;

E – погрешность, аналог ε в разделе «Описании математической модели» и в разделе «Описание (и обоснование выбора) метода решения».

5.5.2 Обозначения выводимых данных

y(x) =a*ln(b*x), y(x) =a*x^2+b*x+c – уравнения используемые в программе;

x – неизвестная, корень уравнения;

x^2 – неизвестная x в степени 2.

5.6 Входные и выходные данные

5.6.1 Входные данные

y(x) =a*ln(b*x), y(x) =a*x^2+b*x+c – функция;

m, n: real – левый и правый промежутки функции соответственно;

a, b, c: real – параметры, коэффициенты уравнения;

E: real – погрешность;

«Помощь и справочная информация».

5.6.2 Выходные данные

x1: real – значение корня уравнения;

st: string – текстовые сообщения, возникающие в процессе выполнения программы (ошибки и варианты дальнейшего продолжения).

5.6.3 Промежуточные данные

Bool_of: Boolean – определяет цикл выполнения алгоритма решения;

mass: real – массив [1. . 20] ;

number: byte – глобальная переменная, номер функции;

code_of: byte – переменная, отвечающая за необходимость поиска корня уравнения;

root: real – разность приближений.

5.7. Алгоритм решения задачи


5.7.1. Алгоритм нахождения корня уравнения y(x) =a×ln(b×x)

Алгоритм решения уравнения вида y(x) =a×ln(b×x) приводится на рисунке 5.4.

пока (( m n ) и ((( m n m > 0) и ( n > 0))));

Программа для решения квадратных уравнений на C++

Довольно часто в пособиях по программированию встречаются задания по нахождению решений каких-нибудь математических уравнений. Задача нахождения корней квадратного уравнения — это довольно тривиальная задача, как и многие другие задачи. Решается она очень просто при помощи листа бумаги и ручки, но решение можно автоматизировать посредством написания прикладной программы и её использования. В этой статье мы напишем такую программу.

Алгоритм решения квадратного уравнения

Многие знают, что уравнение вида ax 2 + bx + c = 0 , где a не равно 0, называют квадратным уравнением.

Существуют различные способы решения квадратных уравнений, но мы рассмотрим решение через дискриминант.

Обозначается дискриминант буквой D . Из школьного курса знаем, что D = b 2 — 4ac .

Существует несколько условий:

  • Если D > 0, то решение имеет 2 различных вещественных корня.
  • Если D = 0, то оба вещественных корня равны.
  • Если D для ввода\вывода в консоли, #include для работы с математическими функциями и область using namespace std;

Просим пользователя ввести значения переменных и сохраняем каждое значение

Проверяем условие, если дискриминант больше или равен 0, то находим корни и выводим

в противном случае выводим сообщение

На этом всё, осталось скомпилировать, запустить и проверить. Запускаем и вводим данные, чтобы D был меньше 0

В этом случае D = 3*3 — 4*2*3 = -15, а это меньше 0, значит ответ программа дала верный.

Ответы тоже верны. Программа работает правильно.

Ниже представлен весь листинг программы для нахождения корней квадратного уравнения на C++

Для вас это может быть интересно:

Программа для решения квадратных уравнений на C++ : 24 комментария

Программировать так сложно…

  1. 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. Дело в том, что тут куча вариантов сделать ошибку, при этом их понимание приходит не сразу, т.е. школьник решая задачу напишет по формуле которой учили (ну и вот как у вас). А потом надо разбираться и смотреть как программа может сломаться, при этом разрабатывать тесты.

  1. Николай Сергейчук Автор записи 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 a;
cout <> b;
cout <> c;
D = pow(b, 2) — 4 * a * c;
cout

ну и? если даже тупо скопировать код и вставить его в cpp.sh , ничего не работает. поебота какая то этот с++

Уважаемая, Лена! Я, надеюсь, вы знаете, что код программы, написанной на языке программирования C++ нельзя тупо вставить в блокнот и сохранить под названием «cpp.sh»? Если не знали, то я, видимо, открыл для вас Америку!

помогите решить. заданы 3 перемены a.b.c записать вы радение на С
< 7a/b+2a, если a=b,
Х= < -34, если a>b,
< 3a/(2b-100), если a>b и а не равно != с

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 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

  1. Николай Сергейчук Автор записи 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 a1;

if((b1*b1 — 4*a1*c1) >= 0) <
y1 = ( -1*b1 + sqrt(b1*b1 — 4*a1*c1)) / (2 * a1);
cout = 0, y1 >= 0, y2 >= 0) <
z = (x1 + y1)/(x2 +y2);
cout

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Уравнения

Решение уравнений онлайн

Если вы это читаете, значит вас интересует вопрос решения уравнений.

Да, наши калькуляторы могут решить все уравнения, которые встречаются в школьном курсе и не только. Но нужно понимать, что большинство уравнений имеют несколько способов решения, а калькулятор выдает лишь только какое-то одно.

Бесспорно все способы решения хороши по-своему, но каждому методу отводится свое место в программе обучения.

Поэтому не стоит злоупотреблять калькуляторами, если ваш школьный учитель или личный репетитор требует решить уравнение одним способом, а вы предоставляете ему альтернативное решение.

Да, это может быть похвально, но опытный педагог сразу поймет, что решение уравнения не ваше.

Калькулятор решения уравнений

Калькулятор уравнений незаменимый помощник. Именно помощник, а не решатель проблем. Всегда старайтесь своими силами решать уравнения, а калькулятор используйте в качестве проверки вашего ответа.

Для грамотного учителя не столько важен конечный ответ, сколько сам ход решения уравнения.

Как вы могли заметить, при решении некоторых уравнений, например, квадратных, калькулятор может выполнить три разных способа решения. Это разложение уравнения на множители, выделение полного квадрата или найти корни уравнения через дискриминант.

Попытайтесь сначала самостоятельно решить заданное уравнение, вспомните чему вас учили на уроке.

Даже если вы ошибетесь в числах, то ничего страшного, ученик имеет право на ошибку, главное правильно мыслить.

С нашим калькулятором уравнений вы с легкостью исправите допущенную в вычислениях ошибку.


источники:

http://nicknixer.ru/programmirovanie/programma-dlya-resheniya-kvadratnyx-uravnenij-na-c/

http://math24.biz/equation