С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 29.11.2016
Сообщений: 14
1

Исследование функции(подправить код)

19.01.2017, 19:10. Показов 708. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер) Программа исследует функцию на min,max и zeros.Неправильно считаются необходимые значения второй функции(f6).
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <iostream>
#include <math.h>
 
using namespace std;
 
void show_array(double *, int);
double f4(double x) { return pow(cos(2*x-1),2)+1.8*x-0.5; }
double f6(double x) { return pow(x-0.5,2); }
double f8(double x) { return pow(cos(2*x-1),2)+1.8*x-0.5 + 1.4*pow(x-0.5,2); }
double my_min(double *, int, double *, double *);
double my_max(double *, int, double *, double *);
double zero(double(*)(double), double, double, double);
double massive(double *, double(*)(double), double, double, double);
 
int main()
{
double a = -5.0, b = 5.0;
double dx = 1;
int e;
int n = (b - a) / dx + 1;
double *A_massive = new double[n];
double *B_massive = new double[n];
double *C_massive = new double[n];
massive(A_massive, f4, a, b, dx);
show_array(A_massive, n);
massive(B_massive, f6, a, b, dx);
show_array(B_massive, n);
massive(C_massive, f8, a, b, dx);
show_array(C_massive, n);
double *c = new double;
double *d = new double;
cout « "Choose variant :\n 1 - Minimum of function\n 2 - Maximum of function\n 3 - Zero of function\n ";
cin » e;
switch (e)
{
case 1: my_min(A_massive, n, c, d);
cout « "\nMinimum element f4 is " « *c « ". Argument is " « *d « endl;
my_min(B_massive, n, c, d);
cout « "\nMinimum element f6 is " « *c « ". Argument is " « *d « endl;
my_min(C_massive, n, c, d);
cout « "\nMinimum element f4+1.4f6 is " « *c « ". Argument is " « *d « endl; break;
case 2: my_max(A_massive, n, c, d);
cout « "\nMaximum element f4 is " « *c « ". Argument is " « *d « endl;
my_max(B_massive, n, c, d);
cout « "\nMaximum element f6 is " « *c « ". Argument is " « *d « endl;
my_max(C_massive, n, c, d);
cout « "\nMaximum element f4+1.4f6 is " « *c « ". Argument is " « *d « endl; break;
case 3: cout « "Zero f4 is " « zero(f4, a, b, dx) « endl;
cout « "Zero f6 is " « zero(f6, a, b, dx) « endl;
cout « "Zero f4+1.4f6 is " « zero(f8, a, b, dx) « endl; break;
default: cout « "Wrong option" « endl;
}
return 1;
}
 
void show_array(double *A, int n)
{
for (int i = 0; i<n; i++)
cout « A[i] « endl;
cout « endl;
}
 
double my_min(double *A, int n, double *x, double *y)
{
double min = A[0];
double a = -5.0, dx = 1;
int I_min = -5;
for (int i = 0; i<n; i++)
if (A[i]<min)
{
min = A[i];
I_min = a + i*dx;
}
*x = min;
*y = I_min;
return min;
}
 
double my_max(double *A, int n, double *x, double *y)
{
double max = A[0];
double a = -5.0, dx = 1;
int I_max = -5;
for (int i = 0; i<n; i++)
if (A[i]>max)
{
max = A[i];
I_max = a + i*dx;
}
*x = max;
*y = I_max;
return max;
}
 
double zero(double(*f4)(double), double a, double b, double dx)
{
double x_left = a; double x_right = b; double x_mid;
if ((f4(x_left))*(f4(x_right))<0)
while ((x_right - x_left)>dx)
{
x_mid = (x_left + x_right) / 2;
if ((f4(x_left))*(f4(x_mid))<0)
x_right = x_mid;
else x_left = x_mid;
}
return (x_mid);
}
 
double massive(double *A_massive, double(*f4)(double), double a, double b, double dx)
{
int n = (b - a) / dx + 1;
for (int i = 0; i<n; i++)
A_massive[i] = f4(a + dx*i);
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2017, 19:10
Ответы с готовыми решениями:

Подправить код
#include &lt;iostream&gt; #include &lt;locale&gt; #include &lt;ctype.h&gt; using namespace std; int main () {...

Подправить код
Ввожу строку с 30 символов. Нужно вывести целое число и упорядочить за возростанием Добавлено...

Подправить код
Помогите пожалуйста, нужно подправить код: /* Дана целочисленная квадратная матрица. Опередить:...

Подправить код
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; const int n=10; float X; double...

15
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
19.01.2017, 21:00 2
Цитата Сообщение от Lemniscator Посмотреть сообщение
C++
1
pow(x-0.5,2)
Зачем использовать pow, когда можно просто перемножить:
C++
1
(x-0.5)*(x-0.5)
0
0 / 0 / 0
Регистрация: 29.11.2016
Сообщений: 14
20.01.2017, 18:50  [ТС] 3
сути дела это не меняет
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
20.01.2017, 18:55 4
Цитата Сообщение от Lemniscator Посмотреть сообщение
Неправильно считаются необходимые значения второй функции(f6).
В чём это выражается?
0
0 / 0 / 0
Регистрация: 29.11.2016
Сообщений: 14
20.01.2017, 19:35  [ТС] 5
Экстремум функции f6 в 0 получается равен 2.65959e-307 т.е. 0, а должно быть 0,5.
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
20.01.2017, 20:37 6
Цитата Сообщение от Lemniscator Посмотреть сообщение
а должно быть 0,5
А шаг dx = 1.
0
0 / 0 / 0
Регистрация: 29.11.2016
Сообщений: 14
22.01.2017, 13:34  [ТС] 7
Так он и равен единице)
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
22.01.2017, 13:40 8
Цитата Сообщение от Lemniscator Посмотреть сообщение
Так он и равен единице
Программа вычисляет значения функции с шагом dx = 1, то есть в точках x = -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5.
Точка x = 0.5 в этом списке отсутствует. Если хочешь её найти, сделай шаг dx = 0.5.
0
0 / 0 / 0
Регистрация: 29.11.2016
Сообщений: 14
22.01.2017, 14:03  [ТС] 9
я делал шаг 0.5 в рез-те получалось тоже 0(а аргумент вообще 6). 1-я функция считается правильно
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
22.01.2017, 14:09 10
Цитата Сообщение от Lemniscator Посмотреть сообщение
я делал шаг 0.5
В том числе внутри функции my_min?
0
0 / 0 / 0
Регистрация: 29.11.2016
Сообщений: 14
22.01.2017, 14:12  [ТС] 11
естественно. Правда в этом случае аргумент равен 0
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
22.01.2017, 14:23 12
Lemniscator, если не затруднит, выложи полный текст программы с правильным шагом. И укажи в какой строке выводятся неверные данные (и сами данные).
0
0 / 0 / 0
Регистрация: 29.11.2016
Сообщений: 14
22.01.2017, 14:38  [ТС] 13
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <math.h>
 
using namespace std;
 
void show_array(double *, int);
double f4(double x) { return pow(cos(2*x-1),2)+1.8*x-0.5; }
double f6(double x) { return (x-0.5)*(x-0.5); }
double f8(double x) { return pow(cos(2*x-1),2)+1.8*x-0.5 + 1.4*((x-0.5)*(x-0.5)); }
double my_min(double *, int, double *, double *);
double my_max(double *, int, double *, double *);
double zero(double(*)(double), double, double, double);
double massive(double *, double(*)(double), double, double, double);
 
 
int main()
{
    double a = -5.0, b = 5.0;
    double dx = 0.5;
    int e;
    int n = (b - a) / dx + 1;
    double *A_massive = new double[n];
    double *B_massive = new double[n];
    double *C_massive = new double[n];
    massive(A_massive, f4, a, b, dx);
    show_array(A_massive, n);
    massive(B_massive, f6, a, b, dx);
    show_array(B_massive, n);
    massive(C_massive, f8, a, b, dx);
    show_array(C_massive, n);
    double *c = new double;
    double *d = new double;
    cout << "Choose variant :\n 1 - Minimum of function\n 2 - Maximum of function\n 3 - Zero of function\n ";
    cin >> e;
    switch (e)
    {
    case 1: my_min(A_massive, n, c, d);
        cout << "\nMinimum element f4 is " << *c << ". Argument is " << *d << endl;
        my_min(B_massive, n, c, d);
        cout << "\nMinimum element f6 is " << *c << ". Argument is " << *d << endl;
        my_min(C_massive, n, c, d);
        cout << "\nMinimum element f4+1.4f6 is " << *c << ". Argument is " << *d << endl; break;
    case 2: my_max(A_massive, n, c, d);
        cout << "\nMaximum element f4 is " << *c << ". Argument is " << *d << endl;
        my_max(B_massive, n, c, d);
        cout << "\nMaximum element f6 is " << *c << ". Argument is " << *d << endl;
        my_max(C_massive, n, c, d);
        cout << "\nMaximum element f4+1.4f6 is " << *c << ". Argument is " << *d << endl; break;
    case 3: cout << "Zero f4 is " << zero(f4, a, b, dx) << endl;
        cout << "Zero f6 is " << zero(f6, a, b, dx) << endl;
        cout << "Zero f4+1.4f6 is " << zero(f8, a, b, dx) << endl; break;
    default: cout << "Wrong option" << endl;
    }
    return 1;
}
 
void show_array(double *A, int n)
{
    for (int i = 0; i<n; i++)
        cout << A[i] << endl;
    cout << endl;
}
 
double my_min(double *A, int n, double *x, double *y)
{
    double min = A[0];
    double a = -5.0, dx = 0.5;
    int I_min = -5;
    for (int i = 0; i<n; i++)
        if (A[i]<min)
        {
            min = A[i];
            I_min = a + i*dx;
        }
    *x = min;
    *y = I_min;
    return min;
}
 
double my_max(double *A, int n, double *x, double *y)
{
    double max = A[0];
    double a = -5.0, dx = 0.5;
    int I_max = -5;
    for (int i = 0; i<n; i++)
        if (A[i]>max)
        {
            max = A[i];
            I_max = a + i*dx;
        }
    *x = max;
    *y = I_max;
    return max;
}
 
double zero(double(*f4)(double), double a, double b, double dx)
{
    double x_left = a; double x_right = b; double x_mid;
    if ((f4(x_left))*(f4(x_right))<0)
        while ((x_right - x_left)>dx)
        {
            x_mid = (x_left + x_right) / 2;
            if ((f4(x_left))*(f4(x_mid))<0)
                x_right = x_mid;
            else x_left = x_mid;
        }
    return (x_mid);
}
 
double massive(double *A_massive, double(*f4)(double), double a, double b, double dx)
{
    int n = (b - a) / dx + 1;
    for (int i = 0; i<n; i++)
        A_massive[i] = f4(a + dx*i);
    return 0;
}
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
22.01.2017, 14:41 14
Цитата Сообщение от likehood Посмотреть сообщение
И укажи в какой строке выводятся неверные данные (и сами данные).
???
0
0 / 0 / 0
Регистрация: 29.11.2016
Сообщений: 14
22.01.2017, 14:47  [ТС] 15
Результаты
Миниатюры
Исследование функции(подправить код)   Исследование функции(подправить код)   Исследование функции(подправить код)  

0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
22.01.2017, 16:04 16
68 строка:
C++
1
int I_min = -5;
Поменяй int на double.

Добавлено через 16 минут
Функция zeros, 99 строка:
C++
1
if ((f4(x_left))*(f4(x_right))<0)
для функции f6 выражение будет ложным, и функция тут же завершится, вернув середину отрезка, то есть ноль.
Где-то в алгоритме ошибка.

Добавлено через 4 минуты
Цитата Сообщение от likehood Посмотреть сообщение
и функция тут же завершится, вернув середину отрезка
Точнее, не середину отрезка, а неинициализированное значение переменной x_mid, то есть мусор.

Добавлено через 49 минут
Ещё замечу, что задавать значение dx в нескольких местах программы - порочная практика. Легко забыть поменять это значение в одной из функций, что может привести к трудно находимым ошибкам.
1
22.01.2017, 16:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2017, 16:04
Помогаю со студенческими работами здесь

пожалуйста, подправить код
#include &lt;conio.h&gt; #include &lt;iostream&gt; #include&lt;stdio.h&gt; using namespace std; int sd(int n,...

Требуется подправить код
Очень долгое время не могу сдать лабораторную работу преподу в универе. Докапывается до ошибок в...

Помогите подправить код
Задача. Вводится n-значный массив состоящий из целых элементов. Надо найти произведение четных...

getch () C++ подправить код
Хочу сделать младшему брату небольшой решебник по математике... =)) помню что когда-то изучая...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru