ฉันเป็นผู้เขียนCQUAD
ใน GSL อินเทอร์เฟซเกือบจะเหมือนกับอินเทอร์เฟซของQAGS
ดังนั้นหากคุณเคยใช้อินเทอร์เฟซหลังมันก็ไม่ยากที่จะลองใช้ตัวเก่า เพียงจำไว้ว่าอย่าแปลงค่าของคุณNaN
เป็นInf
ศูนย์ในปริพันธ์และรหัสจะจัดการกับสิ่งเหล่านี้เอง
กิจวัตรประจำวันยังมีอยู่ในคู่เป็นquadcc
และใน Matlab ที่นี่
คุณสามารถให้ตัวอย่างของอินทิกรัลที่คุณติดต่อด้วยได้หรือไม่?
ปรับปรุง
นี่คือตัวอย่างของการใช้CQUAD
เพื่อรวมฟังก์ชั่นที่มีภาวะเอกฐานที่หนึ่งในจุดสิ้นสุด:
#include <stdio.h>
#include <gsl/gsl_integration.h>
/* Our test integrand. */
double thefunction ( double x , void *param ) {
return sin(x) / x;
}
/* Driver function. */
int main ( int argc , char *argv[] ) {
gsl_function f;
gsl_integration_cquad_workspace *ws = NULL;
double res, abserr;
size_t neval;
/* Prepare the function. */
f.function = &thefunction;
f.params = NULL;
/* Initialize the workspace. */
if ( ( ws = gsl_integration_cquad_workspace_alloc( 200 ) ) == NULL ) {
printf( "main: call to gsl_integration_cquad_workspace_alloc failed.\n" );
abort();
}
/* Call the integrator. */
if ( gsl_integration_cquad( &f, 0.0 , 1.0 , 1.0e-10 , 1.0e-10 , ws , &res , &abserr , &neval ) != 0 ) {
printf( "main: call to gsl_integration_cquad failed.\n" );
abort();
}
/* Print the result. */
printf( "main: int of sin(x)/x in [0,1] is %.16e +/- %e (%i evals).\n" ,
res , abserr , neval );
/* Free the workspace. */
gsl_integration_cquad_workspace_free( ws );
/* Bye. */
return 0;
}
gcc -g -Wall cquad_test.c -lgsl -lcblas
ซึ่งผมรวบรวมกับ ผลลัพธ์คือ
main: int of sin(x)/x in [0,1] is 9.4608307036718275e-01 +/- 4.263988e-13 (63 evals).
.94608307036718301494
โปรดทราบว่าไม่มีอะไรพิเศษที่นี่ไม่ต้องบอกCQUAD
ว่าภาวะเอกฐานอยู่ที่ไหนหรือการดูแลเป็นพิเศษใด ๆ ภายในอินทิเกรตและตัวมันเอง ฉันแค่ปล่อยให้มันคืนNaN
s และผู้รวบรวมจะดูแลพวกเขาโดยอัตโนมัติ
โปรดทราบว่ามีข้อผิดพลาดใน GSL เวอร์ชันล่าสุด 1.15 ซึ่งอาจส่งผลต่อการรักษาภาวะเอกฐาน มันได้รับการแก้ไขแล้ว แต่ยังไม่ได้ทำการแจกจ่ายอย่างเป็นทางการ bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
ผมใช้แหล่งที่มาล่าสุดกับการดาวน์โหลด