Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Gustavo Sankara
0 / 0 / 0
Регистрация: 26.11.2016
Сообщений: 8
#1

Решение нелинейных уравнений методом деления пополам - C++

27.11.2016, 17:02. Просмотров 631. Ответов 5
Метки нет (Все метки)

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

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
program Dihotomia;
 
var a, b, c, eps, a1, b1: real;
    k: integer;
    ch: char;
 
 function f(x:real): real;
 begin
  f:=2*x*x*x-3*x*x-12*x; {Вводим выражение для вычисления функции}
 end;
 
 begin
  {Вывести условие задачи}
  writeln('Решение уравнения "2x^3-3x^2-12x=0" методом дихотомии.');
  writeln;
  {Ввод исходных данных}
  write ('Введите левую границу:'); read(a); {Введите левую границу интервала}
  write ('Введите правую границу:'); read(b); {Введите правую границу интервала}
  write ('Введите требуемую точность:'); read(eps); {Введите требуемую точность}
  writeln;
  writeln ('a=', a:3:7); {Вывод значения левой границы интервала}
  writeln ('b=', b:3:7); {Вывод значения правой границы интервала}
  writeln ('eps=', eps:3:7); {Вывод значения требуемой точности}
  writeln;
 
  a1:=a; b1:=b; {Запоминать исходные данные}
  k:=0; {Счетчик повторений}
 
  {Проверка введенных значений}
  if (a1=b1) then
  writeln('Ошибка! Левая часть интервала не должна равняться правой.');
  if (a1>b1) then
  writeln('Ошибка! Левая часть интервала не должна быть больше правой.');
 
 {Цикл}
 while abs(b-a) > eps {Пока условие больше точности...}
  do {...выполять}
  begin
   k:=k+1; {Увел. счетчик на 1}
   c:=(a+b)/2; {Узнаем середину интервала}
    if f(c)=0 then {Если функция равно 0, то..}
    begin
    {... вывести точный корень}
     writeln ('Уравнение на интервале (',a1:4:3, '; ',b1:4:3,') имеет точный корень x=', c:4:5);
     break; {Прервать вывод, чтобы ответ не повторялся бесконечно}
    end;
    if f(a)*f(c)<0 then b:=c; {Если функция а умноженная на функцию с меньше 0, тогда c это b}
    if f(a)*f(c)>0 then a:=c; {Если функция а умноженная на функцию с больше 0, тогда c это a}
  end;
 
 {Проверка и вывод значений}
 begin
  if (f(c)<>0) and (a1<=b1) then {Если функция c не равна 0 и
                                 левая часть интервала меньше или равно правой,
                                 тогда вывести результат, иначе сообщить точный корень}
   begin
    {Вывод корня на интервале}
    writeln ('Уравнение на интервале (',a1:4:7, '; ',b1:4:7,') имеет корень x=', c:4:5);
    writeln;
    writeln ('Точность ',eps:4:7, ' достигнута за ' ,k, ' шага(ов)', '.');
   end;
 end;
end.
Сам я в с++ ни в зуб ногой, но я изучаю его. Есть сайт, где показано как объявляются те или иные операторы на паскаль и рядом на с++.

Я уже обращался сюда и без помощи не остался.
В общем, надеюсь на повторную помощь.
Заранее спасибо.






Добавлено через 2 минуты




Вот, что написал до сих пор.
Вроде бы работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cmath>
 
using namespace std;
/* ÏåðåìåГ*Г*ûå*/
float a;
float b;
float c;
float eps;
float a1;
float b1;
int k;
char ch;
/* ÔóГ*êöèÿ*/
double f(double x)
{
return 2*x*x*x-3*x*x-12*x; /*ÂûðГ*æåГ*ГЁГҐ äëÿ âû÷èñëåГ*ГЁГї*/   
}
/* ГЌГ*Г·Г*ëî ïðîãðГ*ììû*/
int main()
{
    /*Âûâîä óñëîâèÿ Г§Г*Г¤Г*Г·ГЁ*/
cout <<"ГђГҐГёГҐГ*ГЁГҐ ГіГ°Г*ГўГ*ГҐГ*ГЁГї (2x^3-3x^2-12x=0) ìåòîäîì äèõîòîìèè."<<endl;
cout << endl;
cout << "Ââåäèòå ëåâóþ ГЈГ°Г*Г*èöó:";        cin>>a;
cout << "Ââåäèòå ГЇГ°Г*ГўГіГѕ ГЈГ°Г*Г*èöó:";       cin>>b;
cout << "Ââåäèòå òðåáóåìóþ òî÷Г*îñòü:";   cin>>eps;
 
cout << endl;
 
cout << "a=" << a << endl;        
cout << "b=" << b << endl;       
cout << "eps=" << eps << endl;
 
cout << endl;
 
return 0;   
}
Добавлено через 1 час 9 минут
Я тут дописал, но есть ошибка в конце, помогите разобраться.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <cmath>
 
using namespace std;
 
float a;
float b;
float c;
float eps;
float a1;
float b1;
int k;
char ch;
 
double f(double x)
{
return 2*x*x*x-3*x*x-12*x;  
}
 
int main()
{
    
cout <<endl;
cout <<"Solution of equation (2x^3-3x^2-12x=0) with helping of method of bisection."<<endl;
cout << endl;
cout << "Enter left border:";        cin>>a;
cout << "Enter right border:";       cin>>b;
cout << "Enter accuracy (eps):";   cin>>eps;
cout << endl;
cout << "a=" << a << endl;        
cout << "b=" << b << endl;       
cout << "eps=" << eps << endl;
 
cout << endl;
 
  a1=a; b1=b;
  k=0; 
 
if (a1=b1) cout << "Error! Left part don't must be equally  right part! ";
if (a1>b1) cout << "Error! Left part don't must be over then right part! ";
 
while (abs(b-a) > eps)
do {
k=(k+1);
c=((a+b)/2);
 
  if (((f(c)))==0) {
 cout << "Equation on interval " << a1 <<";"<< b1 <<" have accurate root x=" << c;
 break;
}
if ((((f(a))*(f(c))))<0)
b=c;
 
if ((((f(a))*(f(c))))>0) 
a=c;    
}
 
 if (((f(c))!=0) && (a1<=b1)); /* OSHIBKA TUT */
 {
    cout << "Equation on interval " << a1 <<";"<< b1 <<" have accurate root x=" << c;
    
    cout << "Accuracy (eps) achieved per " << k <<" step(s).";
 }
 
return 0;   
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2016, 17:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Решение нелинейных уравнений методом деления пополам (C++):

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

Методом половинного деления найти решение нелинейных уравнений
Методом половинного деления найти решение следующих нелинейных

Метод деления отрезка пополам для решения нелинейных уравнений (метод дихотомии)
Здравствуйте. Помогите пожалуйста дописать программу. Вот что вымучал, но на...

Решение нелинейных уравнений. Метод половинного деления
Здравствуйте, помогите, пожалуйста, найти ошибку в программе. Программа выдает...

Решение нелинейного уравнения методом деления отрезка пополам
Ребята очень прошу помогите?! Ничего не получается, а если честно вообще...

Решение нелинейных уравнений методом итераций
Нашел на форуме такой пример решения уравнения методом итераций: #include...

5
Doctor123
22 / 22 / 8
Регистрация: 03.12.2013
Сообщений: 127
27.11.2016, 23:43 #2
Вижу, что в 39 строке вместо проверки на равенство "==" у Вас присваивание "="
Нужно два знака равно поставить для сравнения "=="
1
Gustavo Sankara
0 / 0 / 0
Регистрация: 26.11.2016
Сообщений: 8
27.11.2016, 23:53  [ТС] #3
Спасибо, я бы сам это точно не заметил, ибо только пару дней изучаю с++. Но программа всё равно не работает. Я буду очень благодарен, если вы мне поможете исправить ошибку. Пока что это не в моей компетенции)).
0
Doctor123
22 / 22 / 8
Регистрация: 03.12.2013
Сообщений: 127
28.11.2016, 00:30 #4
Лучший ответ Сообщение было отмечено Gustavo Sankara как решение

Решение

Вот так работает?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "stdafx.h"
#include <iostream>
// #include <cmath>
 
using namespace std;
 
float a;
float b;
float c;
float eps;
float a1;
float b1;
int k;
char ch;
 
double f(double x)
{
    double x_1 = 2*x*x*x;
    double x_2 = 3*x*x;
    double x_3 = 12*x;
    double res = x_1 - x_2 - x_3;
 
return res;  
}
 
 
int main(int argc, char* argv[])
{
    cout << endl;
    cout <<"Solution of equation (2x^3-3x^2-12x=0) with helping of method of bisection."<<endl;
    cout << endl;
    cout << "Enter left border:";        cin>>a;
    cout << "Enter right border:";       cin>>b;
    cout << "Enter accuracy (eps):";   cin>>eps;
    cout << endl;
    cout << "a=" << a << endl;        
    cout << "b=" << b << endl;       
    cout << "eps=" << eps << endl;
 
    cout << endl;
 
      a1=a; b1=b;
      k=0; 
 
 
    if (a1 == b1) 
    {
        cout << "Error! Left part don't must be equally  right part! ";
        return 0;
    }
    if (a1 > b1) 
    {
        cout << "Error! Left part don't must be over then right part! ";
        return 0;
    }
 
    while (abs(b-a) > eps)
    {
          k ++;
          c=(a + b) / 2;
 
          if (f(c)==0) 
          {
            cout << "Equation on interval " << a1 <<";"<< b1 <<" have accurate root x=" << c;
            return 0;  //  break;
          }
          if(f(a) * f(c) < 0) b=c;
          if(f(a) * f(c) > 0) a=c;   
    }
    cout << " Quit from 'while' " << abs(b-a) << endl;
 
     if ((f(c)!= 0) && (a1<=b1)) //OSHIBKA TUT 
     {
        cout << "Equation on interval " << a1 <<";"<< b1 <<" have accurate root x=" << c;
    
        cout << "Accuracy (eps) achieved per " << k <<" step(s).";
     }
    return 0;
}
1
Gustavo Sankara
0 / 0 / 0
Регистрация: 26.11.2016
Сообщений: 8
28.11.2016, 01:08  [ТС] #5
Чистый код без ошибок. Спасибо огромное. Очень выручили.
0
Doctor123
22 / 22 / 8
Регистрация: 03.12.2013
Сообщений: 127
28.11.2016, 01:14 #6
Буду рад, если мой сайт: del поможет Вам быстрее освоить C++
1
28.11.2016, 01:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2016, 01:14
Привет! Вот еще темы с решениями:

Решение системы нелинейных уравнений методом ньютона
Доброго времени суток.В общем, нужно решить систему нелинейных уравнений...

Решение системы нелинейных уравнений методом Ньютона (С/С++)
Здравствуйте! Помогите пожалуйста написать программу :cry: У меня есть...

Решение нелинейных уравнений методом простой итерации
Решение нелинейных уравнений методом простой итерации. Реализовать заданный...

Решение нелинейных и трансцендентных уравнений методом Рыбакова
помогите пожалуйста сделать прогу на Borland C++: решение нелинейных и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru