NAG(Numerical Algorithms Group, www.nag.com)库是一个无与伦比的算法库,它提供的算法可靠、轻便、严谨,覆盖了数学与统计方方面面。最大的缺点就是:它是一个收费的算法库。

Origin从OriginPro8开始就包含了NAG库的所有函数,通过Origin C可以轻易调用所有这些NAG函数。

Origin C调用NAG库函数的主要说明:

1.头文件

#include <OC_nag.h>  // 这个头文件包括所有通用的NAG头文件

2.NagError结构体,Origin C里的定义如下:

typedef struct {
int code; // Out: Error Code
BOOL print; // In: print? yes/no, not used in Origin C
char message[NAG_ERROR_BUF_LEN]; // InOut: Error message
UINT handler; //Error handling function, not used from OriginC
int errnum; // May hold useful value for some errors
} NagError;

所有的NAG库的函数都接受NagError结构体的指针作为其中的一个参数。通过这个结构体可以测试对应调用的函数是否成功。当调用完函数后,可以通过测试code的值是否为NE_NOERROR(#define NE_NOERROR 0)来判断是否成功。

下面演示如何通过调用NAG库的函数来做一个简单的线性回归。用到的NAG库函数为:

void nag_simple_linear_regression (Nag_SumSquare mean,
Integer n, const double x[], const double y[],
const double wt[], double *a, double *b,
double *a_serr, double *b_serr, double *rsq,
double *rss, double *df, NagError *fail)

调用的时候,函数名字除了用nag_simple_linear_regression,也可以用g02cac,后者有点像是代号一样。

参数说明:

1.mean: 类型为Nag_SumSquare,Origin C里这样定义:

#define Nag_SumSquare_start 1362
typedef enum {Nag_AboutMean=Nag_SumSquare_start, Nag_AboutZero} Nag_SumSquare;

这个参数指定是否把直线模型y=a+bx中的a常数项包括入回归当中。如果mean的值为Nag_AboutMean,则回归常项包括进来,否则为Nag_AboutZero就不包括常数项。

2.n:观察值的个数。如果mean == Nag_AboutMean,n要大于等于2,如果mean == Nag_AboutZero,n要大于等于1。

3.x[]:自变量。

4.y[]:因变量。

5.wt[]:权重。如果没有权重,则为NULL。

6.a:输出值。如果mean == Nag_AboutMean,输出值为回归常数项,否则为0。

7.b:输出值。线性模型的系数。

8.a_serr:输出值。回归常数项的标准差。

9.b_serr:输出值。系数的标准差。

10.rsq:输出值。判定系数。

11.rss:输出值。残差平方和。

12.df:输出值。自由度。

13.fail: NagError结构体,可以用来判断回归是否成功。

函数代码如下:

void Origin_Call_NAG() {  // 定义一个Origin C函数,编译通过可以直接在Origin的Script Window直接运行
Nag_SumSquare mean = Nag_AboutMean; // 回归中包括常数项
int n;
double *x, *y, *wt;
double a, b, a_serr, b_serr, rsq, rss, df;
NagError fail; // 准备数据
n = 8;
x = (double *)malloc(sizeof(double) * n);
y = (double *)malloc(sizeof(double) * n);
wt = (double *)malloc(sizeof(double) * n);
x[0] = 1.0;
x[1] = 0.0;
x[2] = 4.0;
x[3] = 7.5;
x[4] = 2.5;
x[5] = 0.0;
x[6] = 10.0;
x[7] = 5.0;
y[0] = 20.0;
y[1] = 15.5;
y[2] = 28.3;
y[3] = 45.0;
y[4] = 24.5;
y[5] = 10.0;
y[6] = 99.0;
y[7] = 31.2;
wt[0] = 1.0;
wt[1] = 1.0;
wt[2] = 1.0;
wt[3] = 1.0;
wt[4] = 1.0;
wt[5] = 1.0;
wt[6] = 1.0;
wt[7] = 1.0; // 调用NAG函数
nag_simple_linear_regression(mean, n, x, y, wt,
&a, &b, &a_serr, &b_serr,
&rsq, &rss, &df, &fail);
// 或者这样
//g02cac(mean, n, x, y, wt, &a, &b, &a_serr,
//&b_serr, &rsq, &rss, &df, &fail); if (fail.code != NE_NOERROR) { // 回归失败
printf("错误来自于nag_simple_linear_regression(g02cac)。\n%s\n",
fail.message);
} else {
if (mean == Nag_AboutMean) {
printf("\n回归常数项 a = %6.4f\n", a);
printf("回归常数项的标准差 a_serr = %6.4f\n", a_serr);
}
printf("回归系数 b = %6.4f\n", b);
printf("回归系数的标准差 b_serr = %6.4f\n", b_serr);
printf("判别系数R^2 rsq = %6.4f\n", rsq);
printf("残差平方和 rss = %6.4f\n", rss);
printf("自由度 df = %6.4f\n", df);
} free(x);
free(y);
free(wt);
}

源码可于github下载:https://github.com/gkimeeq/OriginAdvancedApplication。

Origin C调用NAG库的更多相关文章

  1. Java调用动态库方法说明-最详细

    Java不能直接调用由c或者c++写得dll(TF_ID.dll),所以只能采用jni得方法,一步一步生成符合规范得dll文件(假设叫FANGJIAN.dll),在FANGJIAN.dll这个文件里来 ...

  2. C#:控制台程序调用中间库创建窗体

    1.类库项目引用System.Windows.Forms并添加引用后,才可创建窗体. 2.控制台应用程序调用中间库(DLL)中的方法创建窗体:中间类库使用反射下的Assembly加载包含窗体的类库及创 ...

  3. Android JNI如何调用第三方库

    http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的 ...

  4. C++调用C#库简单例程

    有些时候,为了使用别人已经写好的C#库文件,我们需要使用C++调用C#库文件: 以下做了一简单的调用工程,步骤如下: 1.准备C#库 (dll文件)   1)创建C#库:     2)编写C#类:   ...

  5. iOS开发:在Swift中调用oc库

    先列举这个工程中用到的oc源码库: MBProgressHUD:半透明提示器,Loading动画等 SDWebImage:图片下载和缓存的库 MJRefresh: 下拉刷新,上拉加载 Alamofir ...

  6. Qt中调用PolarSSL库(一)

    最近一直在学习SSL相关的知识,也是先了解理论相关的知识,主要是SSL相关的基本概念和连接建立过程,主要是基于PolarSSL开源库进行学习.学习完了之后就希望能给有所运用,就想用Qt写一个简单的程序 ...

  7. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  8. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

  9. windows下Qt Creator5.1.0编写程序以及调用OpenCV库

    系统说明 最近使用opencv编写程序,程序编的差不多就学习使用QT加个界面,首先声明下本人的系统和使用的软件版本, 系统: windows xp QT IDE:QT Creator5.1.0 Ope ...

随机推荐

  1. org.apache.shiro.web.servlet.ShiroHttpServletRequest cannot be cast to org.springframwork.web.mult..

    在用dwz框架+spring MVC时上传文件报的错 详细错误例如以下: 事实上就是一个类型转换错误,但却研究了好长时间,怎么都不知道哪里错了.由于前面卸过一个文件上传的和这个差点儿相同,那个就没有问 ...

  2. jeewx 微信管家 - 举办商业版本号免费试用活动

    jeewx 微信管家 举办商业版本号免费试用活动 1,关注微信账号:jeecg_scott 2.输入:"jeewx商业版本号试用活动: 你的邮箱(比如:zhangsan@11.com)&qu ...

  3. ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下

    ADO.NET   一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data  → DataTable, ...

  4. LinearLayout (线性布局)的分析

    android提供了5中布局,线性布局,相对布局,帧布局.表格布局和绝对布局 线性和相对布局用的是最多的 以下要说的是线性布局 提到线性布局 一定要记住.它里面的全部组件一定不会重叠的, 切不会换行. ...

  5. NYOJ 330 一个简单的数学题【数学题】

    /* 题目大意:求解1/n; 解题思路:写一个输出小数的算法 关键点:怎样处理小数点循环输出 解题人:lingnichong 解题时间:2014-10-18 09:04:22 解题体会:输出小数的算法 ...

  6. ocpm

    学习中心 | 腾讯社交广告营销平台 http://e.qq.com/ads/learning/data/optimization/case/035/

  7. CNN 文本分类模型优化经验——关键点:加卷积层和FC可以提高精度,在FC前加BN可以加快收敛,有时候可以提高精度,FC后加dropout,conv_1d的input维度加大可以提高精度,但是到256会出现OOM。

    network = tflearn.input_data(shape=[None, max_len], name='input') network = tflearn.embedding(networ ...

  8. cf 749D Leaving Auction

    Leaving Auction time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  9. hdu 4587(枚举+割顶)

    TWO NODES Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  10. [Codeforces Round495A] Sonya and Hotels

    [题目链接] https://codeforces.com/contest/1004/problem/A [算法] 直接按题意模拟即可 时间复杂度 :O(NlogN) [代码] #include< ...