Я пытаюсь построить функцию (gaussian function) с C++. Проблема заключается в том, что выходы не являются гладкими, а график выглядит неровным. Ниже я присоединяю вывод той же функции, что и MATLAB, а другой с C++ (Примечание: график увеличен, так что только вид пика функции виден, чтобы прояснить разницу). И вот код C++:
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int main(){
int matrix = 100000;
long double y[matrix], x=0.0, step=0.1;
double FWHM = 1000, alpha;
alpha = FWHM/(2*log(2));
for (int i=0; i<matrix; i++) {
x = x + step;
y[i] = exp(-pow((x-3000.0),2.0)/pow(alpha,2.0));
}
}
и это код MATLAB:
matrix = 100000;
x=0.0; step=0.1;
FWHM = 1000;
alpha = FWHM/(2*log(2));
for i=1:matrix
x = x + step;
y(i) = exp(-((x-3000.0).^2.0)/alpha.^2.0);
end
Как вы храните данные и планируете их? Основываясь на форме графика, я думаю, что вы выгрузите y [i] в текстовый файл, прочитайте из Matlab и запишите их. Также я подозреваю, что вы не устанавливали точность во время печати. Если вы не установите точность, по умолчанию будет 6, поэтому выход будет зазубрен, как вы упомянули (например, 11 из 1 на графике и на выходе).
Как правило, не рекомендуется удалять двойные данные в текстовом файле, так как вы потеряете точность. Используйте двоичные данные, такие как hdf5, protobuf и т.д.
std::cout << y[i] << std::endl;
std::cout << std::setprecision(16) << y[i] << std::endl;
# without std::setprecision. There are 11 of 1's. The graph has 11 of 1 too.
0.999998
0.999998
0.999999
0.999999
0.999999
1
1
1
1
1
1
1
1
1
1
1
0.999999
0.999999
0.999999
0.999998
# with std::setprecision
0.999998078189791
0.9999984433334466
0.9999987700410408
0.9999990583125361
0.9999993081478993
0.9999995195471015
0.9999996925101183
0.9999998270369299
0.9999999231275207
0.9999999807818797
1
0.9999999807818797
0.9999999231275207
0.9999998270369299
0.9999996925101183
0.9999995195471015
0.9999993081478993
0.9999990583125361
0.9999987700410408
0.9999984433334466