Я пытаюсь использовать Rsundials пакет для решения системы обыкновенных дифференциальных уравнений (ОДУ) с использованием Солнечные часы. Во-первых, я пытаюсь запустить пример в руководстве.
Rsundials могут использоваться для решения ODE, когда правая часть ODE описана в C-файле.
Во-первых, ODE описываются в файле C (пример программы из пакета)
#include "include/nvector/nvector_serial.h"#include "include/sundials/sundials_dense.h"#define Ith(v,i) ( NV_DATA_S(v)[i - 1] )
int rhs(realtype t, N_Vector y, N_Vector ydot, void *f_data){
realtype y1, y2, y3;
y1 = Ith(y,1); y2 = Ith(y,2); y3 = Ith(y,3);
/* Change values of ydot here using Ith(ydot,i) */
double L = 49.3;
double a21 = 0.011; double a12 = 0.012;
double a31 = 0.0039; double a13 = 0.000035;
double a01 = 0.021; double a02 = 0.016;
Ith(ydot, 1) = -(a01 + a21 + a31)*y1 + a12*y2 + a13*y3 + L;
Ith(ydot, 2) = a21*y1 - (a02 + a12)*y2;
Ith(ydot, 3) = a31*y1 - a13*y3;
return(0);
}
сохранено в файле test_rsundials.c
, Затем файл компилируется с помощью следующей команды в терминале
R CMD SHLIB ./test_rsundials.c
Файл компилируется без каких-либо сообщений об ошибках. и я вижу test_rsundials.so
а также test_rsundials.o
в моем каталоге генерируется.
Тогда я использую dyn.load
загрузить пакет —
dyn.load("/ .. path .. /test_rsundials.so")
Нет сообщения об ошибке на шаге выше, наконец, я вызываю решатель cvode, используя следующие команды (как показано в руководстве пакета)
library(Rsundials)
vals <- cvodes(c(0.0,0.0,0.0), seq(0,400,20),"test_rsundials","rhs",rtol=1e-4,atol=c(1e-8,1e-14,1e-6),verbose=T)
Это генерирует ошибку —
Error in .Call("cvodes", PACKAGE = "Rsundials", as.double(y), as.double(times), :
"cvodes" not available for .Call() for package "Rsundials"
Я также попробовал следующую команду
yvals <- .Call("cvodes",package="Rsundials",c(0.0,0.0,0.0), seq(0,400,20),"test_rsundials","rhs",rtol=1e-4,atol=c(1e-8,1e-14,1e-6),verbose=T)
что дает мне ошибку
Error in .Call("cvodes", package = "Rsundials", c(0, 0, 0), seq(0, 400, :
C symbol name "cvodes" not in load table
Я не уверен, как я могу обойти это, или что это значит. Я вставляю код из cvodes
ниже для справки
function (y, times, package, rhs, fndata = NULL, jacfunc = NULL,
rootfunc = NULL, numroots = 0, rtol = 1e-06, atol = 1e-06,
maxnumsteps = 500, maxstep = 0, verbose = FALSE, lasttime = FALSE)
{
if (!is.numeric(y))
stop("Error: 'y' must be numeric")
if (!is.numeric(times))
stop("Error: 'times' must be numeric")
if (!is.character(package))
stop("Error: 'package' must be a character vector")
if (!is.character(rhs))
stop("Error: 'Right Hand Side function must be a character vector")
if (!is.null(jacfunc) && !is.character(jacfunc))
stop("Error: 'jacfunc' must be a character vector")
if (!is.null(rootfunc) && !is.character(rootfunc))
stop("Error: 'rootfunc' must be a character vector")
if (!is.null(rootfunc) && numroots <= 0)
stop("Error: numroots must be greater than 0")
if (!is.numeric(numroots))
stop("Error: 'numroots' must be numeric")
if (!is.numeric(rtol))
stop("Error: 'rtol' must be numeric")
if (!is.numeric(atol))
stop("Error: 'atol' must be numeric")
if (!is.numeric(maxstep))
stop("Error: 'maxsteps' must be numeric")
if (!is.null(fndata) && !is.numeric(fndata))
stop("Error: Data arguments must be numeric")
s = 1
rhs = getNativeSymbolInfo(rhs, PACKAGE = package)$address
jfunc = NULL
if (!is.null(jacfunc))
jfunc = getNativeSymbolInfo(jacfunc, PACKAGE = package)$address
rofunc = NULL
if (!is.null(rootfunc))
rofunc = getNativeSymbolInfo(rootfunc, PACKAGE = package)$address
solutions = .Call("cvodes", PACKAGE = "Rsundials", as.double(y),
as.double(times), rhs, as.double(fndata), jfunc, rofunc,
as.integer(numroots), as.integer(s), as.double(rtol),
as.double(atol), as.integer(maxnumsteps), as.integer(maxstep),
as.integer(verbose), as.integer(lasttime))
if (lasttime == TRUE)
rows = 1
else rows = length(times)
solutions <- matrix(solutions, rows)
col <- c()
for (i in 1:length(y)) col[i] <- paste("y", i, sep = "")
if (lasttime == TRUE)
dimnames(solutions) <- list(times[length(times)], col)
else dimnames(solutions) <- list(times, col)
solutions
}
<environment: namespace:Rsundials>
Также вставлены ниже детали о моем R
> version
_
platform x86_64-apple-darwin13.1.0
arch x86_64
os darwin13.1.0
system x86_64, darwin13.1.0
status
major 3
minor 1.0
year 2014
month 04
day 10
svn rev 65387
language R
version.string R version 3.1.0 (2014-04-10)
nickname Spring Dance
Я читал, что это может быть проблема 64-битной v / s 32-битной компиляции, я не уверен, как я могу указать компиляцию в 64-битном флаге. Я новичок в R и C, поэтому любая помощь будет высоко ценится!
Опубликовать обновление — Я читал, что эта ошибка может быть связана с проблемами с библиотекой. Я посмотрел на ЦСИ папка этого пакета, а там есть файл Makevars.old
что подразумевает, что мне может понадобиться связаться с библиотеками
PKG_CFLAGS=-w
PKG_LIBS=-L. -lsundials_cvodes -lsundials_ida -lsundials_fida -lsundials_nvecserial
ПРИМЕЧАНИЕ. — В руководстве к пакету сказано, что «Установка SUNDIALS не является обязательным условием для пакета». Так что я вставил все файлы в src
Папка этого пакета в папке моего проекта (так что, надеюсь, нет файлов, не найдены ошибки).
Теперь я попытался скомпилировать следующие команды в терминале
export PKG_CFLAGS="-w"export PKG_LIBS="-L. -lsundials_cvodes -lsundials_nvecserial"R CMD SHLIB test_rsundials.c sundials_dense.c nvector_serial.c
Я получаю следующую ошибку сейчас
clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -w -fPIC -Wall -mtune=core2 -g -O2 -c nvector_serial.c -o nvector_serial.o
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -o nvector_serial.so nvector_serial.o sundials_dense.o test_rsundials.o -L. -lsundials_cvodes -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
ld: library not found for -lsundials_cvodes
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [nvector_serial.so] Error 1
Хотя я вижу три новых .o
файлы (test_rsundials.o
, nvector_serial.o
а также sundials_dense.o
) генерируются
Любая помощь будет высоко ценится!!
Задача ещё не решена.