Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Gustavo Sankara
0 / 0 / 0
Регистрация: 26.11.2016
Сообщений: 8
#1

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

27.11.2016, 17:02. Просмотров 465. Ответов 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++):

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

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

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

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

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

Решение нелинейных уравнений методом итераций - C++
Нашел на форуме такой пример решения уравнения методом итераций: #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;iostream.h&gt; ...

5
Doctor123
21 / 21 / 5
Регистрация: 03.12.2013
Сообщений: 124
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
21 / 21 / 5
Регистрация: 03.12.2013
Сообщений: 124
28.11.2016, 00:30 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот так работает?

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
21 / 21 / 5
Регистрация: 03.12.2013
Сообщений: 124
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
Привет! Вот еще темы с ответами:

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

Решение системы нелинейных уравнений методом Ньютона (С/С++) - C++
Здравствуйте! Помогите пожалуйста написать программу :cry: У меня есть система из 2х уравнений (x+lnx)(y+lny)=1 ...

Решение нелинейных уравнений методом простой итерации - C++
Реализовать заданный алгоритм для уравнения x^3+x^2-1=0, решив уравнение с заданной пользователем точностью на с++. Помогите пожалуйста не...

Решение нелинейных уравнений методом простой итерации - C++
Решение нелинейных уравнений методом простой итерации. Реализовать заданный алгоритм для уравнения , решив уравнение с заданной...


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

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

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