Я установил библиотеку gsl с помощью команды sudo apt установить libgsl2, однако, когда я запускаю следующую программу с помощью gcc,
#include<stdio.h>
#include<math.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>
double x;
double nu;
int main(){
x=4;
nu=2;
double chi;
chi=gsl_cdf_chisq_P (double x, double nu);
printf("%lf",chi);
}
Следующее сообщение отображается при компиляции с использованием gcc -o file filename.c
gsl/gsl_rng.h: No such file or directory
compilation terminated.
Пропустил ли я какой-либо шаг во время установки или требуется использовать какой-либо флаг во время компиляции?
Возможный дубликат Научная библиотека Gnu перестала работать в Ubuntu 16.04





Вам необходимо установить пакет libgsl-dev.
Этот пакет содержит включаемые файлы, необходимые для вашей разработки.
В случае сомнений просмотрите список файлов в пакете.
$ dpkg -L libgsl2
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libgsl.so.19.0.0
/usr/lib/x86_64-linux-gnu/libgslcblas.so.0.0.0
/usr/lib/x86_64-linux-gnu/libgslcblas.so.0
/usr/lib/x86_64-linux-gnu/libgsl.so.19
/usr/share/doc
/usr/share/doc/libgsl2
...
just doc files and nothing more
А с пакетом dev вы получаете
$ dpkg -L libgsl-dev
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libgsl.a
/usr/lib/x86_64-linux-gnu/libgslcblas.a
/usr/lib/x86_64-linux-gnu/pkgconfig
/usr/lib/x86_64-linux-gnu/pkgconfig/gsl.pc
/usr/include
/usr/include/gsl
...
and all the header files here
То есть пакет dev предоставляет вам все необходимые заголовки и библиотеки статического импорта, полезные в случае статической сборки.
P.S. Не пугайтесь отсутствия 2 в названии пакета libgsl-dev по сравнению с libgsl2. Оба будут одной и той же версии 2.x в вашей системе Ubuntu или ее производной.
P.P.S. Есть еще несколько проблем с вашим кодом.
Функция, которую вы используете gsl_cdf_chisq_P(), принадлежит к набору функций CDF, поэтому вам необходимо включить <gsl/gsl_cdf.h>. И вам нужно правильно вызывать функцию как gsl_cdf_chisq_P (x, nu) вместо gsl_cdf_chisq_P (double x, double nu).
Полученный код может выглядеть так:
#include<stdio.h>
#include<math.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_cdf.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>
int main(){
double x=0.05;
double nu=9;
double chicdf, chi;
chi=gsl_cdf_chisq_Pinv (1-x, nu);
chicdf=gsl_cdf_chisq_P (chi, nu);
printf("ICDF[Chisquared<%d>](1 - %lf) = %lf\n"
"CDF[Chisquared<%d>](%f) = %lf\n",
(int)nu,x,chi,(int)nu,chi,chicdf);
return 0;
}
Чтобы скомпилировать его, запустите
gcc -Wall -O2 testchisq.c -o testchisq -lgsl -lgslcblas -lm
Он должен напечатать
ICDF[Chisquared<9>](1 - 0.050000) = 16.918978
CDF[Chisquared<9>](16.918978) = 0.950000
Я установил libgsl-dev. Отображается следующее сообщение. Я пытаюсь получить значение хи-квадрат с помощью gsl_cdf_chisq_P. Разве это не встроенная функция? Я получаю следующее сообщение: .GOF.c:12:5: warning: implicit declaration of function ‘gsl_cdf_chisq_P’ [-Wimplicit-function-declaration] chi=gsl_cdf_chisq_P (double x, double nu); ^ GOF.c:12:22: error: expected expression before ‘double’ chi=gsl_cdf_chisq_P (double x, double nu);
@Natasha Вам нужно включить gsl/gsl_cdf.h и вызвать функцию как gsl_cdf_chisq_P (x, nu)
Большое спасибо за помощь, но я все еще сталкиваюсь с проблемами при компиляции :~$ gcc -Wall -O2 -lgsl -lgslcblas -lm GOF.c -o testchisq /tmp/ccDByBsq.o: In function main ': GOF.c :(. Text.startup + 0x15): undefined ссылка на gsl_cdf_chisq_P' collect2: error: ld returned 1 exit status
@ Наташа Ой, попробуй gcc -Wall -O2 GOF.c -o testchisq -lgsl -lgslcblas -lm . Интересно, почему в моей системе сработал другой порядок?
Да, в Ubuntu опция --as-needed добавляется к командной строке collect2 при вызове из gcc. В других дистрибутивах этот параметр опущен, поэтому можно указать имена библиотек перед именем исходного файла. Это внутренний механизм. Это означает, что имя исходного файла в ubuntu должно быть указано перед параметрами -l.
Работает как шарм. К сожалению, полученное мной значение хи-квадрат отличается от того, что указано в этой ссылке [kisi.deu.edu.tr/joshua.cowley/Chi-square-table.pdf] Ввод в коде double x=0.05;double nu=9; Полученный результат: 0. Фактическое значение, указанное в таблице хи-квадрат, составляет 16,919 Я указал уровень значимости 5%, что соответствует x=0.05. Любая помощь будет принята с благодарностью.
@Natasha то, что вы на самом деле ищете, - это функция Inverse CDF. Это то, что у вас в таблице. Замените вызов функции на gsl_cdf_chisq_Pinv (1-x, nu)
Спасибо :-). Я хотел бы знать, есть ли функция для теста Колмогорова Смринова. Я поискал в руководстве [gnu.org/software/gsl/doc/html/index.html visible.I не нашел ни одного совпадения.
@Natasha Существуют общедоступные реализации Колмогоровского распределения на основе GSL. Например, рассмотрим ЯТ. Но мы отвлеклись от вашего исходного вопроса.
Вам нужно найти, где gsl / gsl_rng.h находится в вашей системе, если он находится в нестандартном месте, вам нужно указать путь включения в опции -I, также проверьте, есть ли у вас разрешения на чтение этого файла