linux系统里用fortran解非线性方程组

linux系统里用fortran解非线性方程组,第1张

如需编辑回答或

收起

30linux系统里用fortran解非线性方程组

提问者: cldylr

各位高手,请问在linux系统下的fortran怎么求解比较复杂的非线性方程组呢,两个变量,书上有IMSL模块下的NEQNF,但是在终端里面运行的时候又显示打不开或者没有这个目录,是不是linux系统下没有这个模块,还是我没有装,如果没有这个模块,那应该用什么方法解呢,最好有现成的函数,因为刚接触fortran。要自己编算法时间和能力上也有问题,谢谢各位了插入图片,请点击标题到问题详情页

linux lpopt 安装目录是:在系统 /usr/local 目录下,默认是放在新建的 build 文件夹中。代码是../configure --prefix=/usr/localmake。

linux lpopt检测编译是否成功的代码是:sudo make testsudo make install。

linux lpopt安装代码是:

cd ~/Ipopt-3.12.8/ThirdParty/Blas

./get.Blascd ../ASL

./get.ASLcd ../Lapack

./get.Lapackcd ../Mumps

./get.Mumpscd ../Metis。

/get.Metis

下载完第三方库之后,回到 Ipopt-3.12.8 文件夹路径下,cd ../../mkdir buildcd build。

使用linux lpopt解决非线性规划最优化问题的方法是:

第一步:求解目标函数的梯度。

第二步:求解约束条件的Jacobian矩阵。

第三步:求解目标函数和约束条件的Hessian矩阵。即求解。

得到至此,准备工作已经就绪,接下来调用Ipopt 的API接口进行计算。

1、get_nlp_info设置以下的参数:n=4//变量x个数、m=2//约束条件个数、nnz_jac_g=8//Jacobian非零个数、Nnz_h_lag=10//Hessian非零个数。

2、get_bounds_info 设置以下的参数:x_l[i]设置xi的下界值、x_u[i]设置xi的上界值、g_l[i]设置约束i的下界值、g_u[i]设置约束i的上界值。

sk_buff是Linux网络中最核心的结构体,它用来管理和控制接收或发送数据包的信息。各层协议都依赖于sk_buff而存在。内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体,而是通过增加协议头和移动指针来 *** 作的。如果是从L4传输到L2,则是通过往sk_buff结构体中增加该层协议头来 *** 作;如果是从L4到L2,则是通过移动sk_buff结构体中的data指针来实现,不会删除各层协议头。这样做是为了提高CPU的工作效率。

skb_buff结构如下所示:

这里要声明两个概念的区别,后续直接用这两个概念,注意区分:

(1)线性数据:head - end。

(2)实际线性数据:data - tail,不包含线性数据中的头空间和尾空间。

skb->data_len : skb中的分片数据(非线性数据)的长度。

skb->len : skb中的数据块的总长度,数据块包括实际线性数据和非线性数据,非线性数据为data_len,所以skb->len= (data - tail) + data_len。

skb->truesize : skb的总长度,包括sk_buff结构和数据部分,skb=sk_buff控制信息 + 线性数据(包括头空间和尾空间) + skb_shared_info控制信息 + 非线性数据,所以skb->truesize = sizeof(struct sk_buff) + (head - end) + sizeof(struct skb_shared_info) + data_len。

sk_buff结构体中的都是sk_buff的控制信息,是网络数据包的一些配置,真正储存数据的是sk_buff结构体中几个指针指向的数据区中,线性数据区的大小 = (skb->end - skb->head),对于每个数据包来说这个大小都是固定不变的,在传输过程中skb->end和skb->head所指向的地址都是不变的,这里要注意这个地址不是本机的地址,如果是本机的地址那么数据包传到其他主机上这个地址就是无效的,所以这个地址是这个skb缓冲区的相对地址。

线性数据区是用来存放各层协议头部和应用层发下来的数据。各层协议头部相关信息放在线性数据区中。实际数据指针为data和tail,data指向实际数据开始的地方,tail指向实际数据结束的地方。

用一张图来表示sk_buff和数据区的关系:

这一节介绍先行数据区在sk_buff创建过程中的变化,图中暂时省略了非线性数据区:

2.1中所讲的都是线性数据区中的相关的配置,当线性数据区不够用的时候就会启用非线性数据区作为数据区域的扩展,skb中用skb_shared_info分片结构体来配置非线性数据。

skb_shared_info结构体是和skb中的线性数据区一体的,所以在skb的各种 *** 作时都会把这两个结构看作是一个结构来 *** 作。如:

skb_shared_info结构:

非线性数据区有两种不同的构成数据的方式

(1)用数组存储的分片数据区,采用是是结构体中的frags[MAX_SKB_FRAGS]

对于frags[]一般用在当数据比较多,在线性数据区装不下的时候,skb_frag_t中是一页一页的数据,skb_frag_struct结构体如下:

下图显示了frags是怎么分配分片数据的:

(2)frag_list指针来指向的分片数据:

参考:


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7200799.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-02
下一篇2023-04-02

发表评论

登录后才能评论

评论列表(0条)

    保存