Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 20.12.2021
Сообщений: 10

Обработка экспериментальных данных

08.06.2023, 10:57. Показов 611. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
почему две одинаковые программы на разных языках выдают совершенно разные ответы:
на pascal программы выдаёт правильные ответы, а на C++ ответы неверные.
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
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
117
118
119
120
121
122
123
124
125
Uses Crt;
Const n=6;
xt:array [1..n] of real = (1.00,1.20,1.40,1.60,1.80,2.00);
yt:array [1..n] of real = (5.00,5.60,6.20,6.80,7.40,8.00);
Var
i,k,k0 : integer;
x,x1,x2,y,y1,p,a,a0,b,b0,s,s0 : real;
Begin
ClrScr;
s0:=Maxlongint;
for k:=1 to 15 do
begin
x1:=0; x2:=0;
y1:=0; p:=0;
for i:=1 to n do
begin
x:=xt[i];
y:=yt[i];
{ Линеаризация }
Case k of
2: begin
y:=ln(y);
x:=ln(x);
end;
3: y:=ln(y);
4: y:=1/y;
5: x:=ln(x);
6: x:=1/x;
7: y:=x/y;
8: y:=ln(y);
9: begin
y:=1/y;
x:=exp(-x);
end;
10: y:=ln(y);
11: x:=ln(x)/ln(10);
12: y:=1/y;
13: begin
y:=1/y;
x:=1/x;
end;
14: begin
x:=1/x;
y:=ln(y);
end;
15: begin
x:=1/x;
y:=ln(y)/ln(10);
end;
end;
{ Вычисление коэффициентов }
x1:=x1+x;
x2:=x2+sqr(x);
y1:=y1+y;
p:=p+x*y;
end;
b:=(x1*y1-n*p)/(sqr(x1)-n*x2);
a:=(y1-b*x1)/n;
 
case k of
2,3: a:=exp(a);
8: a:=exp(a*ln(10));
10: begin
a:=exp(a);
b:=exp(b);
end;
12: begin
s:=a;
a:=1/b;
b:=s/b;
end;
13: begin
if a <> 0 then a:=1/a;
b:=b*a;
end;
14: a:=exp(a);
15: a:=exp(a*ln(10));
end;
{ Выбор функции }
s:=0;
for i:=1 to n do
begin
x:=xt[i];
 
case k of
1: y:=a+b*x;
2: y:=a*exp(b*ln(x));
3: y:=a*exp(b*x);
4: y:=1/(a+b*x);
5: y:=a+b*ln(x);
6: y:=a+b/x;
7: y:=x/(a+b*x);
8: y:=a*exp(b*x*ln(10));
9: y:=1/(a+b*exp(-x));
10: y:=a*exp(x*ln(b));
11: y:=a+b*ln(x)/ln(10);
12: y:=a/(b+x);
13: y:=a*x/(b+x);
14: y:=a*exp(b/x);
15: y:=a*exp(b*ln(10)/x);
end;
 
s:=s+sqr(y-yt[i]);
end;
if (s<s0) then
begin
s0:=s;
k0:=k;
a0:=a;
b0:=b;
end;
end;
writeln('1 - y=a+b*x 9 - y=1/(a+b*exp(-x))');
writeln('2 - y=a*exp(b*ln(x)) 10 - y=a*exp(x*ln(b))');
writeln('3 - y=a*exp(b*x) 11 - y=a*b*ln(x)/ln(10)');
writeln('4 - y=1/(a+b*x) 12 - y=a/(b+x)');
writeln('5 - y=a+b*ln(x) 13 - y=a*x/(b+x)');
writeln('6 - y=a+b/x 14 - y=a*exp(b/x)');
writeln('7 - y=x/(a+b*x) 15 - y=a*exp(10*ln(b/x))');
writeln('8 - y=a*exp(10*ln(b*x))');
writeln;
writeln('k0 =',k0:4,' a=',a0:6:3,' b=',b0:6:3,' s=',s0:8:4);
writeln;
readln;
End.
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include <iostream>
#include <cmath>
#include<math.h>
#include <climits>
 
using namespace std;
 
const int n = 6;
 
int k,i,j;
float xt[n]; //= {1.00,1.20,1.40,1.60,1.80,2.00}
float yt[n]; //= {5.00,5.60,6.20,6.80,7.40,8.00}
float x1,x2,y2,p,x,y,b,a,s,k0,a0,b0;
long long int s0 = LLONG_MAX;
 
void Lineariz (int k, float x, float y) {
    switch (k) {
        case 2:
            y = log(y);
            x = log(x);
            break;
        case 3:
            y = log(y);
            break;
        case 4:
            y = 1 / y;
            break;  
        case 5:
            x = log(x);
            break;
        case 6:
            x = 1 / x;
            break;
        case 7:
            y = x / y;
            break;
        case 8:
            y = log(y);
            break;
        case 9:
            y = 1 / y;
            x = exp(-x);
            break;
        case 10:
            y = log(y);
            break;
        case 11:
            x = log(x)/log(10);
            break;
        case 12:
            y = 1 / y;
            break;
        case 13:
            y = 1 / y;
            x = 1 / x;
            break;
        case 14:
            y = log(y);
            x = 1 / x;
            break;
        case 15:
            x = 1 / x;
            y = log(y) / log(10);
            break;
    }
}
 
void Koeff_A_B(int k, float a, float b, float s) {
    switch (k) {
        case 2:
            a = exp(a);
            break;
        case 3:
            a = exp(a);
            break;
        case 8:
            a = exp(a * log(10));
            break;
        case 10:
            a = exp(a);
            b = exp(b);
            break;
        case 12:
            s = a;
            a = 1 / b;
            b = s / b;
            break;
        case 13:
            if (a != 0) {
                a = 1 / a;
            }
            b = b * a;
            break;
        case 14:
            a = exp(a);
            break;
        case 15:
            a = exp(a * log(10));
            break;
    }
}
 
void Function(int k, float x, float y, float a, float b) {
    switch (k) {
        case 1:
            y = a + b * x;
            break;
        case 2:
            y = a * exp(b * log(x));
            break;
        case 3:
            y = a * exp(b * x);
            break;
        case 4:
            y = 1 / ( a + b * x);
            break;
        case 5:
            y = a + b * log(x);
            break;
        case 6:
            y = a + b / x;
            break;
        case 7:
            y = x / (a + b * x);
            break;
        case 8:
            y = a * exp(b * x * log(10));
            break;
        case 9:
            y = 1 / (a + b * exp(-x));
            break;
        case 10:
            y = a * exp(x * log(b));
            break;
        case 11:
            y = a + b * log(x) / log(10);
            break;
        case 12:
            y = a / (b + x);
            break;
        case 13:
            y = a * x / (b + x);
            break;
        case 14:
            y = a * exp(b / x);
            break;
        case 15:
            y = a * exp(b * log(10) / x);
            break;
    }
}
 
int main()
{
    cout<<"Введите парами X и Y:"<<endl;
    for (i = 1;i <= n; i++) {
        cout<<"x["<<i<<"]=";
        cin>>xt[i];
        cout<<"y["<<i<<"]=";
        cin>>yt[i];
    }
    for (k = 1; k <= 15; k++) {
        x1 = 0;
        x2 = 0;
        y2 = 0;
        p = 0;
        for (i = 1; i <= n; i++) {
            x = xt[i];
            y = yt[i];
            Lineariz(k,x,y);
            x1 = x1 + x;
            x2 = x2 + pow(x,2);
            y2 = y2 + y;
            p = p + x*y;
        }
        b = (x1 * y2 - n * p) / (x1 * x1 - n * x2);
        a = (y2 - b * x1) / n;
        Koeff_A_B(k,a,b,s);
        s = 0;
        for (i = 1; i <= n; i++) {
            x = xt[i];
            Function(k,x,y,a,b);
            s = s + pow(y - yt[i],2);
        }
        if (s < s0) {
        s0 = s;
        k0 = k;
        a0 = a;
        b0 = b;
        }
    }
    cout<<"1 - y=a+b*x              9 - y=1/(a+b*exp(-x))"<<endl;
    cout<<"2 - y=a*exp(b*ln(x))     10 - y=a*exp(x*ln(b))"<<endl;
    cout<<"3 - y=a*exp(b*x)         11 - y=a*b*ln(x)/ln(10)"<<endl;
    cout<<"4 - y=1/(a+b*x)          12 - y=a/(b+x)"<<endl;
    cout<<"5 - y=a+b*ln(x)          13 - y=a*x/(b+x)"<<endl;
    cout<<"6 - y=a+b/x              14 - y=a*exp(b/x)"<<endl;
    cout<<"7 - y=x/(a+b*x)          15 - y=a*exp(10*ln(b/x))"<<endl;
    cout<<"8 - y=a*exp(10*ln(b*x))"<<endl;
    cout<<"Результат обработки"<<endl;
    cout<<"k0 = "<<k0<<endl;
    cout<<"a0 = "<<a0<<endl;
    cout<<"b0 = "<<b0<<endl;
    cout<<"s0 = "<<s0<<endl;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.06.2023, 10:57
Ответы с готовыми решениями:

Обработка экспериментальных данных №3
Задание к работе.3 Постройте график z = f (x, y) двумерной сплайн-интерполяции по задан- ным эмпирическим данным (массивы X, Y даны в...

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

Обработка экспериментальных данных
По имеющимся экспериментальным данным построить график и подобрать аналитическую зависимость, которая даёт наименьшее отклонение от...

9
99 / 74 / 28
Регистрация: 30.03.2023
Сообщений: 206
08.06.2023, 11:09
C++
1
void Function(int k, float x, float y, float a, float b)
эта функция делает расчет на копиях переменных k, y, a, b
Поэтому вот здесь
C++
1
2
Function(k,x,y,a,b);
s = s + pow(y - yt[i],2);
при вычислении s значение y - то же самое, что и ДО вызова Function, а не то, что посчиталось внутри.
Хочешь получить рассчитанное значение - либо пусть Function его возвращает, либо пусть он ссылку на y применяет.

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

Так что ответ на твой вопрос
Цитата Сообщение от Dragonar2342 Посмотреть сообщение
почему две одинаковые программы на разных языках выдают совершенно разные ответы
будет
"Потому что программа на С++ написана неправильно"
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
08.06.2023, 11:43
Цитата Сообщение от Dragonar2342 Посмотреть сообщение
for (i = 1;i <= n; i++) {
cout<<"x["<<i<<"]=";
cin>>xt[i];
Это частая ошибка при переходе на С++.
Массивы в С++ индексируются не от 1, а от нуля.
В результате обращение x[n] приводит к выходу за границы массива.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
08.06.2023, 11:47
А что общего между этими двумя программами?
На Паскале одной всё вместе, в рамках одной функции грубо говоря.
На С++ в несколько функций всё разнесено.
Почему вы эти программы вообще сравниваете?
0
0 / 0 / 0
Регистрация: 20.12.2021
Сообщений: 10
08.06.2023, 12:13  [ТС]
zss, , Это не влияет на работу массива ведь в нулевой индекс не используется
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
08.06.2023, 12:16
Цитата Сообщение от Dragonar2342 Посмотреть сообщение
ведь в нулевой индекс не используется
нулевой индекс да, не используется
но и памяти под индекс n вы не выделяете, вот о чем речь.

Вот если было бы написано
float yt[n+1];
тогда другое дело, здесь память под элемент с индексом n выделяется.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
08.06.2023, 12:18
Лучший ответ Сообщение было отмечено Dragonar2342 как решение

Решение

Цитата Сообщение от Dragonar2342 Посмотреть сообщение
Это не влияет на работу массива ведь в нулевой индекс не используется
а n-ый используются?
Цитата Сообщение от Dragonar2342 Посмотреть сообщение
for (i = 1;i <= n; i++)
а это выход за пределы массива и очень даже может влиять
про что и сказал
Цитата Сообщение от zss Посмотреть сообщение
В результате обращение x[n] приводит к выходу за границы массива.
0
0 / 0 / 0
Регистрация: 20.12.2021
Сообщений: 10
08.06.2023, 12:19  [ТС]
leproza, Попробовал сделать функцию возвращающей значение но ничего не поменялось
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
int Function(int k, float x, float y, float a, float b) {
    switch (k) {
        case 1:
            y = a + b * x;
            break;
        case 2:
            y = a * exp(b * log(x));
            break;
        case 3:
            y = a * exp(b * x);
            break;
        case 4:
            y = 1 / ( a + b * x);
            break;
        case 5:
            y = a + b * log(x);
            break;
        case 6:
            y = a + b / x;
            break;
        case 7:
            y = x / (a + b * x);
            break;
        case 8:
            y = a * exp(b * x * log(10));
            break;
        case 9:
            y = 1 / (a + b * exp(-x));
            break;
        case 10:
            y = a * exp(x * log(b));
            break;
        case 11:
            y = a + b * log(x) / log(10);
            break;
        case 12:
            y = a / (b + x);
            break;
        case 13:
            y = a * x / (b + x);
            break;
        case 14:
            y = a * exp(b / x);
            break;
        case 15:
            y = a * exp(b * log(10) / x);
            break;
        return y;
    }
}
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
08.06.2023, 12:22
Цитата Сообщение от Dragonar2342 Посмотреть сообщение
возвращающей значение но ничего не поменялось
какое значение?
Цитата Сообщение от Dragonar2342 Посмотреть сообщение
return y;
оно у тебя int а задано float
Цитата Сообщение от Dragonar2342 Посмотреть сообщение
int Function(int k, float x, float y, float a, float b)
0
0 / 0 / 0
Регистрация: 20.12.2021
Сообщений: 10
08.06.2023, 12:24  [ТС]
ValeryS, увеличил размер массива как вы и сказали. Ответ стал правильным, спасибо большое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.06.2023, 12:24
Помогаю со студенческими работами здесь

Обработка экспериментальных данных
Задание: Для табличных данных найти аппроксимирующую зависимость в виде линейной и квадратичной функции. сделать вывод. исходные данные...

Обработка экспериментальных данных
Ребята помогите с последним заданием.Незнаю даже с чего начать

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

Обработка экспериментальных данных №2
Задание к работе.2 Найти методом наименьших квадратов значения коэффициентов зависи- мости y = f (x) по заданным экспериментальным...

Обработка экспериментальных данных
Добрый день. Дана функция V=1/(A+B*e^(-U) ), и данные U=0 1 1.5 2 2.5 3 3.5 4 4.5 5, V=12 10.1 11.58 17.4 30.68 53.6 87.78 136.9 202.5 287....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru