好库文摘 http://doc.okbase.net/ 1. 各类AR互动系统创意及原理 http://doc.okbase.net/yefuhai/archive/256266.html yefuhai 2018/12/15 17:31:36 CesiumJS - 3D Tiles BIM http://doc.okbase.net/eryar/archive/256265.html eryar 2018/12/15 17:30:55

CesiumJS - 3D Tiles BIM

eryar@163.com

1. Introduction

CesiumJS is an open-source JavaScript library for world-class 3D globes and maps. 

从其官网上可以看到这个库的愿景:成为世界级的三维地图。由于其高性能,对大模型的优化技术,可以用于BIM。支持Cesium的财团里面就有Bentley。Bentley也有工厂CAD软件。

2. Node.js

从nodejs官网https://nodejs.org/en/download/上下载安装包,如果没有安装权限,可以下载免安装的打包文件:

直接解压到d:/nodejs。并在此文件夹中创建两个文件夹:node_global, node_cache,如下图所示:

然后使用CMD窗口,切换到d:/nodejs目录,输入如下命令来设置global和cache:

npm config set prefix “d:/nodejs/node_global”
npm config set cache “d:/nodejs/node_cache”

并修改nodevars.bat中的环境变量:

并运行nodevars.bat。

安装CesiumJS所需要的插件:

npm install compression -g
npm install request -g
npm install yargs -g

 

3. CesiumJS Hello World

在CMD命令窗口中切换到Cesium文件夹,并输入命令:

Node server.js

出现如下图所示的 Cesium development server running locally.

表示Cesium可以在本地运行了。

在浏览器中输入地址:http://localhost:8080,出现如下图所示页面:

点击HelloWorld链接,出现如下图所示的的一个三维地球就表示Cesium安装成功了。

4. 3D Tiles BIM Demo

在Cesium的官网上有Bentley提供的一个工厂BIM模型例子,可以从如下地址查看:

https://cesiumjs.org/Cesium/Build/Apps/Sandcastle/index.html?src=3D%20Tiles%20BIM.html

 

从其官方的介绍来看,Cesium使用的3D Tiles技术可以对三维模型数据进行压缩及其他优化技术,使其可以加载很大的模型的情况下,浏览顺畅。且3D Tiles格式也是开源的,可以学习借鉴。

5. Conclusion

本文介绍了CesiumJS这个JavaScript库的安装和配置,并展示了其在BIM中的一个应用例子。可以通过学习CesiumJS来将PDMS模型转换成3D Tiles格式,来测试其对大模型的支持效果。



为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。

]]>
游戏与Web的服务器对比 http://doc.okbase.net/sunicdavy/archive/256264.html sunicdavy 2018/12/15 17:30:49
为了编写基于cellnet的新一代游戏服务器框架,最近深入研究微服务,ServiceMesh等概念。研究过程中对Web和游戏两种服务器架构设计有一些心得,编写并记录下来。(下文中,Game表示游戏服务器,Web表示Web服务器) ``
状态缓存
所谓状态缓存,就是在内存而非专业数据缓存服务器(如redis)中保存和处理逻辑数据,手动编写此过程较为繁琐但是效率较高,但随着状态逻辑复杂性和并发、扩容问题提出,状态同步会变得越来越复杂。
Game:
强交互性的服务器类型需要在服务器做缓存,逻辑编写也较为容易,无需处理事务并发问题。例如:组队,匹配,战斗逻辑。服务器不能随意重启。
弱交互性的服务器类型可配合redis做成无状态服务器,例如:养成,技能升级,领取物品等。服务器随时支持重启。
游戏服务器为了提高性能,早期所有服务器都是使用状态缓存写法编写,特别是MMORPG这类强交互的游戏服务器尤为严重。
Web:
均为无状态服务器,弱交互。使用事务方式处理并发逻辑,例如:交易,下单等。
推送,单独发送
这里提到的所谓推送,单独发送是与RPC区别的通讯方法。RPC要求请求必须有回应。而推送单独发送则更像是通知和广播,无需目的方返回任何消息。
Game:
找到服务器的Session,直接Send
通过中转服务器,或称为中心服务器进行注册/广播
客户端的model数据需要更新时,服务器会主动推送消息。
游戏服务器没有严格的RPC设计需求,推送和单独发送较Web服务器更多。而且游戏服务器多使用长连接,所以主动推送也比Web服务器来的方便一些。
Web:
将推送做成专有的服务,并做排队和并发处理。
可用性
听说过游戏停服更新,支付宝服务器在刷二维码时停服了可一定被骂惨吧。Web对服务器高可用性要求很高,游戏虽然也注重服务器稳定性和可用性,但是由于版本迭代更新频繁,停服更新反而能获得玩家接受。
Game:
游戏对可用性要求不高。
游戏大版本更新时需要停服更新。支持热更新技术的服务器(例如Erlang,Skynet)仅使用热更新修复bug,很少直接更新新版本。
不是所有的游戏服务器支持动态添加服务器。
Web:
极高的可用性,服务不允许停服更新,使用蓝绿及灰度方式更新服务器。
随时可以横向扩展服务器,提高服务器容量和承载。
连接及传输
均使用TCP传输协议,游戏服务器注重性能,自有协议及二进制协议使用较多。
Web注重兼容和接口友好,使用JSON格式较多。
Game:
使用长连接,需要从逻辑层维护连接状态及处理服务器不在线情况
使用自有封包格式,大部分使用protobuf或二进制流格式。
Web:
微服务大部分使用短连接,grpc支持http2长连接
使用json编码方便调试和版本兼容。
流量限制
人数多了,任何服务器都扛不住,流量限制和登入限制能有效保护服务器稳定。
Game:
单服有人数限制,可以通过GM后台设置挡墙,超过无法进入
Web:
限流器中间件,可以精确到服务控制流量
断流,防止雪崩
Game:
游戏没有,也不需要这种概念,游戏请求不会突然升高,即便有,也通过GM后台人为控制
Web:
断流器中间件
服务发现
如何找到服务器地址。
服务有变化时,通过Watch系统通知订阅者更新本地缓存
服务器没有变化时,使用本地缓存找到服务地址
Game:
游戏服务器互相依赖复用只在很小的范围内,因此无需在不同语言不同进程服务间获得地址,大部分在配置文件中填写各服务的IP及地址即可互相访问。
早期游戏自己编写服务器状态及地址发现服务。
有用redis做服务发现
Web:
使用服务发现系统,分布式部署。无需依赖配置文件
网关需求
Game:
网关处理客户端上下线通知,心跳,维持连接,转发,广播上下行封包
Web:
根据请求地址路由,无上下线概念,无心跳。广播通过消息推送系统完成
由于笔者从事游戏行业,对Web服务器概念在逐渐熟悉中,若有错误和不足请各位大佬指出。
本人新书《Go语言从入门到进阶实战》,生动的语言,例子带有各种彩蛋,轻松了解Go语言特性,更有cellnet框架剖析解密
https://search.jd.com/Search?keyword=go%E8%AF%AD%E8%A8%80%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E8%BF%9B%E9%98%B6%E5%AE%9E%E6%88%98&enc=utf-8&suggest=1.def.0.V02&wq=Go%E8%AF%AD%E8%A8%80%E4%BB%8E&pvid=145d55a92cab4b07b71326f8beb1700b
]]>
Intel TBB in OpenCASCADE http://doc.okbase.net/eryar/archive/256263.html eryar 2018/12/15 17:30:30

Intel TBB in OpenCASCADE

eryar@163.com

 

OpenCASCADE使用了一个开源的第三方库Intel TBB,这个并行计算库主要用于网格化、布尔操作等复杂算法,可以明显提升速度。这个库是可选的,即可以根据授权原因,不使用这个库。

 

如果不用,可以在批处理中配置这个可选第三方库,将其设置成false

  

最近从TBB官网了解到,TBB的授权LicenseGPL改为Apache V2.0,如下图所示:

 

https://www.threadingbuildingblocks.org/faq/10

 

TBB改成Apache V2.0许可后,使用就更加自由。Apache V2.0 License是对商业应用友好的许可,与BSD类似,同样鼓励代码共享和尊重原作者著作权,允许修改代码,不用关心授权费用等。关于Apache V2.0 许可更多信息可上网搜索。

不过TBB 2017版本之前的版本还是GPL许可,之后版本才是Apache V2.0许可。所以如果想在基于opencascade开发的软件中使用TBB而不用开源自己的代码的话,可以使用TBB 2017之后的版本。


为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。

 
]]>
RvmTranslator6.4 is released http://doc.okbase.net/eryar/archive/256262.html eryar 2018/12/15 17:30:14

RvmTranslator6.4 is released

eryar@163.com

 

RvmTranslator can translate the RVM file exported by AVEVA Plant(PDMS)/AVEVA Marine to STEP, IGES, STL, DXF, 3D PDF, OBJ, 3DXML, .etc. So it can be used for exchanging model data between other CAD software, such as Autodesk AutoCAD, Plant3d, 3ds Max, CATIA, Solidworks, Pro/E, Unity3d, .etc.

I am pleased to announce a new release of RvmTranslator6.4.

RvmTranslatoer6.4 is a minor release, which includes the following new features:

 

  1. Fix bugs

Fix the missing model bugs, and test by the Spooler and Stabilizer model:

 

2. Download RvmTrnaslator6.4

https://yun.baidu.com/pcloud/album/info?uk=3808749571&album_id=3634993082542187183

 

 

]]>
OpenCASCADE解非线性方程组 http://doc.okbase.net/eryar/archive/256261.html eryar 2018/12/15 17:29:38

OpenCASCADE解非线性方程组

eryar@163.com

 

Abstract. 在科学技术领域里常常提出求解非线性方程组的问题,例如,用非线性函数拟合实验数据问题、非线性网络问题、几何上的曲线曲面求交问题等。OpenCASCADE中有关于非线性方程组定义的类及其求解类,本文主要介绍如何在OpenCASCADE中定义非线性方程组,及对其进行求解。

Key Words. Function Set, Function Set Root, Newton Raphson Algorithm

1.Introduction

在科学技术领域里常常提出求解非线性方程组的问题,例如,用非线性函数拟合实验数据问题、非线性网络问题等。在几何造型中很多问题也可以利用非线性方程组来解决。如曲线的光顺,曲线求交、曲面求交、Blend造型问题等。

OpenCASCADE提供了非线性方程组的类math_FunctionSet,可以先从类图上来看看有哪些算法使用了这个类:

  

图1 曲线光顺包FaireCurve

 

图2 Blending Surface between two surfaces

感兴趣的同学可以自己打开OpenCASCADE的类索引文件查看。可以看到很多算法涉及到方程组的求解问题。本文主要介绍如何定义非线性方程组及对其进行求解。理解这些套路后,对math_FunctionSet相关的派生类及其用用途就会有个清晰的认识,便于对源码的理解。

2.Function Set Definition

设有非线性方程组

 

为实变量的非线方程函数。引入向量形式表示,引进记号:

 

于是非线性方程组可以简单记作:F(x)=0。我们的问题是寻求X使F(X)=0,这个X就是非线性方程组的解。

OpenCASCADE中使用类math_FunctionSet来表示方程组,这是个抽象类,定义了如下纯虚函数:

l NbVariables():变量的个数,即末知量的个数;

l NbEquations():方程的个数,即方程组中有几个方程;

l Value(const math_Vector&X, math_Vector& F):方程组的值,即代入变量每个方程的值;

3.Function Set Root Algorithm

解非线性方程组的牛顿法和解方程式的思路一样,要求方程有一阶导数。而非线性方程组即是要求有偏导数。由fi(x)偏导数作成的矩阵记为J(x)F’(x),称为F(x)Jacobi矩阵:

 

求解非线性方程组的牛顿法为:

 

其中xk为方程线的近似解向量。

 

OpenCASCADE中也提供了非线性方程组的求解类,如:math_FunctionSetRootmath_NewtonFunctionSetRoot。而使用这些类的输入都是要求具有一阶偏导数的线性方程组的定义math_FunctionSetWithDerivaties。这个类定义了具有一阶偏导数的非线性方程组,其纯虚函数除了前面说明的几个以外,还增加了如下两个:

l Derivatives(const math_Vector& X, math_Matrix& D):一阶偏导数值,即计算Jacobi矩阵;

l Values(const math_Vector& X, math_Vector& F, math_Matrix& D):计算方程的值及一阶偏导数矩阵Jacobi矩阵。

4.Code Example

下面给出一个具体的例子来说明这些类的用法。设有非线性方程组:

 

从几何上看其解就是圆心在原点,半径为2的圆与曲线的交点:

 

圆与曲线求交

下面我们使用OpenCASCADE来对上述问题进行求解。首先定义这个非线性方程组: 

#include <math_FunctionSet.hxx>
#include 
<math_FunctionSetWithDerivatives.hxx>
#include 
<math_FunctionSetRoot.hxx>
#pragma comment(lib, 
"TKernel.lib")
#pragma comment(lib, 
"TKMath.lib")
class MyFunctionSet : public math_FunctionSetWithDerivatives
{
public:
    
virtual Standard_Integer NbVariables() const
    {
        
return 2;
    }
    
virtual Standard_Integer NbEquations() const
    {
        
return 2;
    }
    
virtual Standard_Boolean Value(const math_Vector& X, math_Vector& F)
    {
        F(
1= X(1* X(1+ X(2* X(2- 4.0;
        F(
2= Pow(M_E, X(1)) + X(2- 1.0;
        
return Standard_True;
    }
    
virtual Standard_Boolean Derivatives(const math_Vector& X, math_Matrix& D)
    {
        
// matrix D is Jacobi matrix.
        D(11= 2.0 * X(1);
        D(
12= 2.0 * X(2);
        D(
21= Pow(M_E, X(1));
        D(
22= 1.0;
        
return Standard_True;
    }
    
virtual Standard_Boolean Values(const math_Vector& X, math_Vector& F, math_Matrix& D)
    {
        Value(X, F);
        Derivatives(X, D);
        
return Standard_True;
    }
private:
};
void test()
{
    MyFunctionSet aFunctionSet;
    math_FunctionSetRoot aSolver(aFunctionSet);
    math_Vector aStartingPoint(
12);
    
// 1. (1.0, 1.0)
    aStartingPoint(1= 1.0;
    aStartingPoint(
2= 1.0;
    aSolver.Perform(aFunctionSet, aStartingPoint);
    
if (aSolver.IsDone())
    {
        aSolver.Dump(std::cout);
    }
    
// 2. (1.0, -1.0)
    aStartingPoint(1= 1.0;
    aStartingPoint(
2= -1.0;
    aSolver.Perform(aFunctionSet, aStartingPoint);
    
if (aSolver.IsDone())
    {
        aSolver.Dump(std::cout);
    }
}
int main(int argc, char* argv[])
{
    test();
    
return 0;
}

上述代码先定义了带有一阶偏导数的非线性方程组类:MyFunctionSet,因为有两个变量及两个方程,再分别实现计算方程值及偏导数的虚函数。

然后使用类math_FunctionSetRoot来对方程组进行求解,求解的结果如下图所示:

 

非线性方程组求解结果

由图3可知,两个曲线相交有两个交点,但是使用类math_FunctionSetRoot一次只能计算一个解。从图4的计算结果还可以看出,初值的选择对解的影响很大,既影响计算结果,也影响迭代次数。

 5.Conclusion

综上所述,OpenCASCADEmath工具箱中提供了方程组的定义、求解功能。其中对非线性方程组求解使用的是Newton迭代法,所以要求方程组必须实现计算一阶偏导数的虚函数,即计算Jacobi矩阵。

OpenCASCADE类图中可以看出,方程组定义类用在了很多地方,所以理解上述对方程组的定义及解的用法,对其他使用这个派生类的地方更容易其源码。

 6.References

  1. 同济大学数学教研室高等数学 第四版高等教育出版社. 2004
  2. 易大义沈云宝李有法计算方法浙江大学出版社. 2002

  


为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。

]]>
IsoAlgo3d - IDF/PCF pipeline 3d viewer http://doc.okbase.net/eryar/archive/256260.html eryar 2018/12/15 17:29:16

IsoAlgo3d - IDF/PCF pipeline 3d viewer

eryar@163.com

 

Key Words. IDF, PCF, IsoAlgo, 3D

 

当前国际主流管道设计软件都可以生成IDF/PCF文件,这两种文件格式都是用于Isogen生成管道轴测图。其中IDFISOGEN Data File,主要来自Intergraph PDS AVEVA PDMSPCFPiping Component File,主要来自Intergraph SmartPlant 3DCADWorx。其中在PDMS中生成IDF文件需要对Isodraft进行配置,配置方法如下:

 

进入Isodraft打开Reports and Symbol File选项对话框,

 

Transfer中指定需要生成IDF文件的路径及文件名。当然也可以在Design模块通过自定义ISO图配置文件,也可以直接生成IDF文件。

IDF/PCF文件中包含管道中管件的端点坐标及用于生成ISO轴测图的SKEY等信息,IsoAlgo3d读取这两种文件格式后,可以对其中管道进行三维建模,方便管道直观浏览。

 

如上图所示为IsoAlgo3d显示的管道模型,通过鼠标在三维视图中选择管件,则可以同时在左边树上定位管件属于哪个管线,右边的属性窗口会显示这个管件的信息,如管道等级,材料描述、SKEY等。

如果IDF/PCF文件中包含焊点信息,则可以根据焊点信息显示管段SPOOL,不同的管段SPOOL显示出不同的颜色:

 


为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。


]]>
IsoAlgo3d三维管道软件 http://doc.okbase.net/eryar/archive/256259.html eryar 2018/12/15 17:28:46

IsoAlgo3d三维管道软件

eryar@163.com

 

1.概述

IsoAlgo3d三维管道软件主要用于将目前国际主流管道设计软件AVEVA PDMSIntergraph SmartPlatn3D等软件导出的IDF/PCF文件进行三维模型重建,并在此基础上定制开发管道材料统计、管子零件设计、管子零件图功能。

在导入IDF/PCF后,可在三维模型对焊点信息进行编辑,即重新生成管子零件,方便管道预制车间进行管子零件处理。即拿到设计院的IDF/PCF后,可以直接在IsoAlgo3d中进行三维浏览,与在管道设计软件中显示一样的三维模型。不需要再拿着轴测图来描图等麻烦的手工画图,提高效率。

1 IsoAlgo3d程序界面

 

2.导入PCF/IDF

IsoAlgo3d为自主开发,独有的软件运行平台。可方便地导入IDFISOGEN Data File,来自Intergraph PDS and AVEVA PDMS)、PCFPiping Component File,来自Intergraph SmartPlant 3D等使用ISOGEN的设计软件),实现与设计院/工程设计公司的设计数据无缝对接。导入管道IDF/PCF文件后,可以方便地查看三维模型,并且通过点击相应管件的三维模型,在属性窗口中会显示出管件相关的信息,如管道等级、管件类型、材料代号、材料描述等。

 

2 IsoAlgo3d打开文件对话框

 

3.定义SKEY

因为IDF/PCF主要用于ISOGEN生成管道ISO图,所以对于每种管件都会有个SKEY,即每种管件对应在ISO图上的一个图例。为了使生成的管道三维模型真实还原,所以也提供了SEKY的参数化定义,即为每个SKEY定义三维的参数化模型。

 

3 Gate ValveSKEY参数化

 

根据参数生成的阀门模型

SKEY参数化的方式与AVEVA PDMS或其他软件的管件部件建库的概念类似。有了参数化的功能,就可以自定义管件的三维模型,实现真实还原设计软件中管道模型的能力。

 

4.定义管道等级

为了管道模型与生成IDF/PCF的软件一致,也增加了管道等级的概念。通过在等级定义文件中进一步控制使用的管件SKEY

管道等级定义文件

通过等级定义来进一步细化每个管件SKEY的参数,精确建模。

 

5.结论

通过引入三维参数化SKEY定义及管道定义,可以使IsoAlgo3d对导入的IDF/PCF管道数据进行完美建模,可真实还原设计软件的模型。

6 IsoAlgo3d中显示的PDMS示例工程Spooler管道模型

IsoAlgo3d全面支持IDF/PCF,实现与设计院/工程设计公司的设计数据无缝对接。使数据的传递更有效,避免手工描图带来的不便及错误。

 

6.下载试用

欢迎下载IsoAlgo3d试用,有任何意见、建议都可以与我取得联系:eryar@163.com

下载地址:

https://yun.baidu.com/pcloud/album/info?uk=3808749571&album_id=8423635686953825723

 

 


为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。


]]>
Levmar:Levenberg-Marquardt非线性最小二乘算法 http://doc.okbase.net/eryar/archive/256258.html eryar 2018/12/15 17:28:16

Levmar:Levenberg-Marquardt非线性最小二乘算法

eryar@163.com

Abstract. Levmar is GPL native ANSI C implementations of the Levenberg-Marquardt optimization algorithm.The blog focus on the compilation of levmar on Windows with Visual Studio.

Key Words. Levmar, C, LM least squares

1. levmar简介

Gauss-Newton算法是一个古老的处理非线性最小二乘问题的方法。该方法在迭代过程中要求矩阵J(x)满秩。为了克服这个困难,Levenberg(1944)提出了一种新的方法,但未受到重视。后来Marquardt(1963)又重新提出,并在理论上进行了控讨,得到Levenberg-Marquardt方法,简称LM方法。在此基础上,Fletcher(1971)对其实现策略进行了改进,得到了Levenberg-Marquardt-Fletcher方法(LMF)。再后来,More(1978)将LM方法与信赖域方法结合,建立了带信赖域的LM方法。

LM算法的产生主要是解决曲线最小二乘拟合问题,现在很多软件使用LM算法来解决通用的曲线拟合问题。

本文主要介绍GPL开源库levmar2.6使用Visual Studio在Windows上进行编译。这个开源库的官方网站是:http://users.ics.forth.gr/~lourakis/levmar/

2. 编译levmar

下载源码levmar-2.6解压,在其README.txt中对levmar的授权GPL、编译等进行了说明。在Windows操作系统中,可以使用nmake /f Makefile.vc来编译levmar和一个示例程序。

从官网介绍可知,levmar有些算法依赖LAPACK库,一个线性代数计算开源库。所以如果要使用那些算法,编译的时候必须包含这个库。从示例程序的源文件lmdemo.c中可以看出,有些问题的求解是需要LAPACK库的,相关源码列出如下:

  /* uncomment the appropriate line below to select a minimization problem */
  problem=
          //0; // Rosenbrock function
          //1; // modified Rosenbrock problem
          //2; // Powell's function
      //3; // Wood's function
          4; // Meyer's (reformulated) problem
          //5; // Osborne's problem
      //6; // helical valley function
#ifdef HAVE_LAPACK
      //7; // Boggs & Tolle's problem 3
      //8; // Hock - Schittkowski problem 28
      //9; // Hock - Schittkowski problem 48
      //10; // Hock - Schittkowski problem 51
#else // no LAPACK
#ifdef _MSC_VER
#pragma message("LAPACK not available, some test problems cannot be used")
#else
#warning LAPACK not available, some test problems cannot be used
#endif // _MSC_VER
#endif /* HAVE_LAPACK */
      //11; // Hock - Schittkowski problem 01
      //12; // Hock - Schittkowski modified problem 21
      //13; // hatfldb problem
      //14; // hatfldc problem
      //15; // equilibrium combustion problem
#ifdef HAVE_LAPACK
      //16; // Hock - Schittkowski modified #1 problem 52
      //17; // Schittkowski modified problem 235
      //18; // Boggs & Tolle modified problem #7
      //19; // Hock - Schittkowski modified #2 problem 52
      //20; // Hock - Schittkowski modified problem #76"
#endif /* HAVE_LAPACK */
  switch(problem){
  default: fprintf(stderr, "unknown problem specified (#%d)! Note that some minimization problems require LAPACK.\n", problem);
           exit(1);
    break;

从上述源码可知,如果LAPACK库不可用的时候,示例程序中的问题

l 7 Boggs & Tolle’s problem 3

l 8 Hock - Schittkowski problem 28

l 9 Hock - Schittkowski problem 48

l 10 Hock - Schittkowski problem 51

l 16 Hock - Schittkowskit modified #1 problem 52

l 17 Schittkowski modified problem 235

l 18 Boggs & Tolle modified problem #7

l 19 Hock - Schittkowski modified #2 problem 52

l 20 Hock - Schittkowski modified probem #76

这些问题的求解功能是不能使用的。从头文件levmar.h中要以看出,

#ifdef LM_DBL_PREC
/* double precision LM, with & without Jacobian */
/* unconstrained minimization */
extern int dlevmar_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, int itmax, double *opts,
      double *info, double *work, double *covar, void *adata);
extern int dlevmar_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, int itmax, double *opts,
      double *info, double *work, double *covar, void *adata);
/* box-constrained minimization */
extern int dlevmar_bc_der(
       void (*func)(double *p, double *hx, int m, int n, void *adata),
       void (*jacf)(double *p, double *j, int m, int n, void *adata),  
       double *p, double *x, int m, int n, double *lb, double *ub, double *dscl,
       int itmax, double *opts, double *info, double *work, double *covar, void *adata);
extern int dlevmar_bc_dif(
       void (*func)(double *p, double *hx, int m, int n, void *adata),
       double *p, double *x, int m, int n, double *lb, double *ub, double *dscl,
       int itmax, double *opts, double *info, double *work, double *covar, void *adata);
#ifdef HAVE_LAPACK
/* linear equation constrained minimization */
extern int dlevmar_lec_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *A, double *b, int k,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
extern int dlevmar_lec_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *A, double *b, int k,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
/* box & linear equation constrained minimization */
extern int dlevmar_blec_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub, double *A, double *b, int k, double *wghts,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
extern int dlevmar_blec_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub, double *A, double *b, int k, double *wghts,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
/* box, linear equations & inequalities constrained minimization */
extern int dlevmar_bleic_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub,
      double *A, double *b, int k1, double *C, double *d, int k2,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
extern int dlevmar_bleic_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub, 
      double *A, double *b, int k1, double *C, double *d, int k2,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
/* box & linear inequality constraints */
extern int dlevmar_blic_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub, double *C, double *d, int k2,
      int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
extern int dlevmar_blic_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub, double *C, double *d, int k2,
      int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
/* linear equation & inequality constraints */
extern int dlevmar_leic_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *A, double *b, int k1, double *C, double *d, int k2,
      int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
extern int dlevmar_leic_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *A, double *b, int k1, double *C, double *d, int k2,
      int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
/* linear inequality constraints */
extern int dlevmar_lic_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *C, double *d, int k2,
      int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
extern int dlevmar_lic_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *C, double *d, int k2,
      int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
#endif /* HAVE_LAPACK */
#endif /* LM_DBL_PREC */

从头文件levmar.h中的代码可以看出,在#ifdef HAVE_LAPACK和#endif /* HAVE_LAPACK */之间的函数都是不可用的。除此之外的函数是可用的,如基本的dlevmar_der和dlevmar_dif等函数是不依赖LAPACK库的。如果只使用这几个函数,则可以不用配置LAPACK库,编译levmar就很简单了。

如果不使用LAPACK库,可以先在头文件levmar.h中把#define HAVE_LAPACK 这一行注释掉:

然后再修改Makefile.vc文件,在Makefile.vc中可以看到如下图所示一句注释,即当不使用LAPACK库是,把那一行注释掉(前面加#):

这时就可以启动Visual Studio的编译器CL来编译levmar库了。配置好编译环境的命令工具从Visual Studio的菜单来启动:

要编译32位的levmar库,可以使用x86的命令工具,要编译64位的levmar,可以使用x64的命令工具。启动命令工具后,切换到levmar源码文件夹,并输入命令

nmake /f Makefile.vc

如下图所示:

编译成功生成levmar.lib和lmdemo.exe说明编译成功了。

接着在命令窗口中运行lmdemo.exe,测试levmar例子程序。如果lmdemo正常运行,说明levmar已经成功编译。

自己的程序如果要使用levmar,就可以像使用其他开源库一样,设置头文件路径及库levmar.lib的路径,就可以使用了。




为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。


]]>
qmake生成Visual Studio工程 http://doc.okbase.net/eryar/archive/256257.html eryar 2018/12/15 17:28:10

 

整个Qt在Windows中都可以通过批处理来编译,当编译好Qt后,会生成qmake.exe。

在没有安装Qt-VS-Addin的情况下,如何使用别人提供的Qt *.pro项目文件呢?

使用qmake可以直接生成Visual Studio项目文件,命令如下:

qmake -tp vc


如果不成功,可能还需要配置QMAKESPEC:

set QMAKESPEC=win32-msvc2015


从Visual Studio的菜单启动VS命令窗口,可以把qmake程序的路径设置到环境变量PATH中,再切换到*.pro文件所在目录,使用qmake命令。如果需要递归处理所有*.pro文件,可以加上-recursive选项。完整内容如下:

set PATH=%PATH%;D:/Qt5.8.0/bin;
set QMAKESPEC=win32-msvc2015
qmake -tp vc -recursive
nmake

 

]]>