Гладкость данных, генерируемых C ++

0

Я пытаюсь построить функцию (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

Изображение 174551

Теги:

1 ответ

2
Лучший ответ

Как вы храните данные и планируете их? Основываясь на форме графика, я думаю, что вы выгрузите 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
  • 0
    Благодарю. Ты прав. На самом деле мне нужно было установить точность следующим образом: ofstream myfile ("gaussian.txt"); myfile.precision (16);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню