一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种变量循环/递归定义的自动识别方法

2022-11-23 17:33:17 来源:中国专利 TAG:


1.本发明涉及机械系统动力学建模技术领域,具体涉及一种变量循环/递归定义的自动识别方法。


背景技术:

2.在传统的机械科学研究领域,动力学模型可以用来进行机械系统的特性仿真分析和实时运动控制;机械化动力学建模是一种建立机械系统动力学模型的有效方法。公开号为cn106383973a的发明专利公开了一种非完整约束系统的机械化力学建模方法,其主要思想是,在运动分析过程中采用正向建模的原理给出运动变量的蕴含关系,进一步采用逆序输出的方法建立系统的递推动力学模型。实践证明,专利cn106383973a建立的递推动力学模型可以有效地减少动力学模型常见的重复计算和冗余计算等缺陷,具有很高的计算效率。
3.然而,由于运动分析过程中需要人为的参与介入,该方法的输出模型可能存在变量循环定义(即两个或多个变量之间相互被引用定义,形成闭环定义)及递归定义(即单个变量使用其自身属性来为其下定义)的问题,二者都不能使后续重排序有效处理,致使模型递推计算无法持续进行,最终导致机械化动力学建模可靠性降低。
4.现有针对该问题的解决方案是,对输出模型代入数值计算,根据异常的中断提示,定位计算中断出错的位置,进一步借助人工筛选排查找出存在循环定义或递归定义的变量,最后返回原始建模文档对其进行校正。显然,该方案费时费力,缺少统一可行的自动批量识别对策,尤其是针对复杂的系统建模对象,由于需要采用人工反复试探检测,过程繁杂且效率低下,难以直接应用。


技术实现要素:

5.针对现有技术的不足,本发明提出一种变量循环/递归定义的自动识别方法,其目的是自动识别存在循环定义或递归定义的模型变量,并返回原始建模文档由技术人员对其进行处理,从而使模型变量能够持续进行数值迭代计算。
6.假设现有通过机械化建模方法输出了一个脚本文件作为系统递推动力学模型,并且模型中各变量可能存在循环定义或递归定义的问题,本发明基于该脚本文件对其内部变量进行自动识别。
7.本发明是通过以下技术方案实现的:
8.一种变量循环/递归定义的自动识别方法,如图1所示,包括具体步骤如下:
9.步骤1、导入建模输出的脚本文件,读取内部因式中的变量及表达式;
10.步骤2、初始化:设定有效变量序列,有效变量表达式序列,因变量集合sa,自变量集合sb,识别次数i;
11.步骤3、记有效变量序列的长度为n,并设置因变量集合sa的初始维度d等于1;
12.步骤4、识别次数i清零;
13.步骤5、在有效变量序列中,放回式不重复抽取d个变量元素置于因变量集合sa中;
14.步骤6、遍历因变量集合sa中各变量对应表达式,并将所有表达式中自变量的并集置于自变量集合sb中;
15.步骤7、符号计算:取fa=∑{集合sa各变量},fb=∑{集合sb各变量};
16.步骤8、令δ=f
b-fa;
17.步骤9、检测δ内部各符号元素是否存在符号
“‑”
(负号);
18.若存在符号
“‑”
(负号),则说明因变量集合sa中的变量元素不存在循环/递归定义,执行步骤11;
19.若不存在符号
“‑”
(负号),则说明因变量集合sa中的变量元素存在循环/递归定义,执行步骤10;
20.步骤10、输出因变量集合sa中的变量元素存在循环/递归定义,并返回原始建模文档,由技术人员对其进行处理,使变量元素消除循环/递归定义,执行步骤11;
21.步骤11、识别次数i自加1;
22.步骤12、检测识别次数i是否等于排列组合
23.若识别次数i等于则说明在当前维度下已完成所有不同组合的变量抽样,执行步骤13;
24.若识别次数i不等于则说明在当前维度下尚有未被检测到的变量元素,需返回步骤5;
25.步骤13、检测因变量集合sa的维度d是否等于有效变量序列长度n;
26.若维度d等于序列长度n,则说明已完成所有变量元素的识别,跳转至步骤15;
27.若维度d小于序列长度n,则说明尚未完成所有维度下变量集的识别检测,执行步骤14;
28.步骤14、扩充因变量集合sa的维度,即因变量集合sa的当前维度d自加1,并返回步骤4;
29.步骤15、识别完成后的有效变量及表达式以脚本文件的形式输出;
30.识别处理完成,退出程序。
31.此时输出的脚本文件内部中各变量之间已不存在循环定义或递归定义的问题,即得到可正确迭代计算的系统动力学模型,实现模型变量可持续进行数值迭代计算。
32.上述一种变量循环/递归定义的自动识别方法,其核心算法是,在不同维度下放回式不重复抽取相应个数的模型变量,结合集合理论及符号计算原理,通过识别因变量与自变量之间的集合逻辑关系,可准确定位存在循环/递归定义的模型变量。针对本发明提供的技术方案,可通过第一数学归纳法给予有效证明,即本算法可准确自动识别存在递归定义及不同维度循环定义的模型变量。
33.上述方案步骤3中,记有效变量序列的长度为n,并设置因变量集合sa的初始维度d等于1。该步骤中,所述因变量集合sa的维度d为1时,通过本发明提出的算法可识别各变量是否存在递归定义。
34.上述方案中,所述设置因变量集合sa的初始维度d等于1,并配合后续步骤14逐轮扩充因变量集合sa的维度,其目的是,在保证各模型变量无递归定义的前提下,进一步识别
多维度变量的循环定义时,可避免因模型变量存在递归定义的问题而降低识别循环定义的准确性。
35.本发明的有益效果:
36.(1)与现有技术相比,本发明从原理上分析了通过机械化动力学建模,输出模型可能存在变量循环定义及递归定义的问题,针对性提出了一种变量循环/递归定义的自动识别方法,通过集合理论及符号计算原理可以准确识别存在循环/递归定义的模型变量。
37.(2)本发明利用自动识别批处理方式替代人工检测方式,能够快速定位存在循环/递归定义的模型变量,其算法简明高效,覆盖面广,能够识别所有维度的循环定义,且识别精度高,工程意义明显。
附图说明
38.图1为一种变量循环/递归定义的自动识别方法的算法流程图。
具体实施方式:
39.为使本发明的目的、技术方案和优点更加清晰易懂,给予图1一种变量循环/递归定义的自动识别方法的算法流程图,并结合以下具体实施例,对本发明作进一步详细说明,但本发明并不局限于以下实施例。
40.需要说明的是,针对本发明提供的技术方案,可通过第一数学归纳法给予证明,即本算法可准确自动识别存在递归定义及不同维度循环定义的模型变量。
41.实施例:
42.本实施例假设针对某一系统的机械化建模已完成,并通过逆序输出的方式生成各变量及其对应表达式的脚本文件。
43.输出的脚本文件如下所示:
[0044][0045]
输出的模型变量(a1、a2、a3...an、a
n 1
)将导入计算机硬件系统进行计算。显然,当计算变量a1时,其表达式a3 sin(a1*a6) 7中含有其自身未定义变量a1,属于递归定义;当计算变量a1及变量a3时,二者之间被相互引用定义,形成闭环定义,属于二维循环定义,上述两种情况将会导致模型数值递推计算异常中断。类似地,其余各变量之间可能存在循环/递归定义的问题,该种场景将使后续重排序不能有效处理,从而导致模型递推计算无法持续进行,其结果是降低了机械化动力学建模的可靠性。
[0046]
针对上述问题,需检测脚本文件中存在循环/递归定义的模型变量,并返回原始建模文档待技术人员处理完后,模型计算才能顺利进行。
[0047]
按照本发明所述的算法,计算机自动识别的过程如下:
[0048]
开始:
[0049]
步骤1、导入建模输出的脚本文件,读取内部因式中的变量及表达式;
[0050]
步骤2、初始化:设定有效变量序列,有效变量表达式序列,因变量集合sa,自变量集合sb,识别次数i;
[0051]
步骤3、记有效变量序列的长度n=n 1(本实施例中输出的脚本文件共有n 1个模型变量),并设置因变量集合sa的初始维度d等于1;
[0052]
步骤4、识别次数i清零,即当前识别次数i=0;
[0053]
因变量集合sa的维度d=1:
[0054]
第一轮抽取:
[0055]
步骤5、在有效变量序列中,放回式不重复抽取d个变量元素置于因变量集合sa中,设本轮因变量集合sa={a1};
[0056]
步骤6、遍历因变量集合sa中各变量对应表达式,并将所有表达式中自变量的并集置于自变量集合sb中;
[0057]
因变量集合sa中变量a1对应表达式为:a3 sin(a1*a6) 7;
[0058]
则自变量集合sb={a1,a3,a6};
[0059]
步骤7、符号计算:
[0060]
fa=∑{a1}=a1;
[0061]
fb=∑{a1,a3,a6}=a1 a3 a6;
[0062]
步骤8、令δ=f
b-fa=a1 a3 a
6-a1,即δ=a3 a6;
[0063]
步骤9、检测δ内部各符号元素不存在符号
“‑”
(负号),即sa∈sb,则说明因变量集合sa中的变量元素a1存在递归定义,执行步骤10;
[0064]
步骤10、输出因变量集合sa中的变量元素a1存在递归定义,并返回原始建模文档,由技术人员对其进行处理;
[0065]
本实施例假设对模型变量给予以下修改方案:
[0066]
对变量a1表达式修改为:a3 sin(a6) 7;
[0067]
即a1=a3 sin(a6) 7,显然,此时变量a1已不存在递归定义,其修改后的脚本文件如下所示:
[0068][0069]
完成处理后,再执行步骤11;
[0070]
步骤11、识别次数i自加1,即当前识别次数i=1;
[0071]
步骤12、检测识别次数i不等于排列组合则说明在当前维度下尚有未被检测到的变量元素,需返回步骤5;
[0072]
第二轮抽取:
[0073]
步骤5、在有效变量序列中,放回式不重复抽取d个变量元素置于因变量集合sa中,设本轮因变量集合sa={a2};
[0074]
步骤6、遍历因变量集合sa中各变量对应表达式,并将所有表达式中自变量的并集置于自变量集合sb中;
[0075]
因变量集合sa中变量a2对应表达式为:a7*cos(an) 6a
n 1
4;
[0076]
则自变量集合sb={a7,an,a
n 1
};
[0077]
步骤7、符号计算:
[0078]
fa=∑{a2}=a2;
[0079]
fb=∑{a7,an,a
n 1
}=a7 an a
n 1

[0080]
步骤8、令δ=f
b-fa=a7 an a
n 1-a2,即δ=a7 an a
n
1-a2;
[0081]
步骤9、检测δ内部各符号元素存在符号
“‑”
(负号),即则说明因变量集合sa中的变量元素a2不存在递归定义,执行步骤11;
[0082]
步骤11、识别次数i自加1,即当前识别次数i=2;
[0083]
步骤12、检测识别次数i不等于排列组合则说明在当前维度下尚有未被检测到的变量元素,需返回步骤5;
[0084][0085]
第轮抽取:
[0086]
步骤5、在有效变量序列中,放回式不重复抽取d个变量元素置于因变量集合sa中,设本轮因变量集合sa={a
n 1
};
[0087]
步骤6、遍历因变量集合sa中各变量对应表达式,并将所有表达式中自变量的并集置于自变量集合sb中;
[0088]
因变量集合sa中变量a
n 1
对应表达式为:an 3a2 a
10

[0089]
则自变量集合sb={a2,a
10
,an};
[0090]
步骤7、符号计算:
[0091]
fa=∑{a
n 1
}=a
n 1

[0092]
fb=∑{a2,a
10
,an}=a2 a
10
an;
[0093]
步骤8、令δ=f
b-fa=a2 a
10
a
n-a
n 1
,即δ=a2 a
10
a
n-a
n 1

[0094]
步骤9、检测δ内部各符号元素存在符号
“‑”
(负号),即则说明因变量集合sa中的变量元素a
n 1
不存在递归定义,执行步骤11;
[0095]
步骤11、识别次数i自加1,即当前识别次数i=n 1;
[0096]
步骤12、检测识别次数i等于排列组合则说明在当前维度d=1下已完成所有不同组合的变量抽样,此时的脚本文件如下所示:
[0097][0098]
显然,在因变量集合sa的维度d=1下,识别完成后的各模型变量已不存在递归定义,执行步骤13;
[0099]
步骤13、检测因变量集合sa的维度d小于有效变量序列长度n,则说明尚未完成所有维度下变量集的识别检测,执行步骤14;
[0100]
步骤14、扩充因变量集合sa的维度,即因变量集合sa的当前维度d自加1,则当前维度d=2,并返回步骤4;
[0101]
步骤4、识别次数i清零,即当前识别次数i=0;
[0102]
因变量集合sa的维度d=2:
[0103]
第一轮抽取:
[0104]
步骤5、在有效变量序列中,放回式不重复抽取d个变量元素置于因变量集合sa中,设本轮因变量集合sa={a1,a3};
[0105]
步骤6、遍历因变量集合sa中各变量对应表达式,并将所有表达式中自变量的并集置于自变量集合sb中;
[0106]
因变量集合sa中变量a1,a3对应表达式分别为:a3 sin(a6) 7及2(a1 a2) 3sin(a6);
[0107]
则自变量集合sb={a1,a2,a3,a6};
[0108]
步骤7、符号计算:
[0109]
fa=∑{a1,a3}=a1 a3;
[0110]
fb=∑{a1,a2,a3,a6}=a1 a2 a3 a6;
[0111]
步骤8、令δ=t
b-fa=a1 a2 a3 a
6-a
1-a3,即δ=a2 a6;
[0112]
步骤9、检测δ内部各符号元素不存在符号
“‑”
(负号),即sa∈sb,则说明因变量集合sa中的变量元素a1,a3存在二维循环定义,执行步骤10;
[0113]
步骤10、输出因变量集合sa中的变量元素a1,a3存在二维循环定义,并返回原始建模文档,由技术人员对其进行处理;
[0114]
本实施例假设对模型变量给予以下修改方案:
[0115]
对变量a1表达式不做修改,对变量a3表达式修改为:2(4a5 a2) 3sin(a6);
[0116]
即a1=a3 sin(a6) 7,a3=2(4a5 a2) 3sin(a6),显然,此时变量a1与变量a3之间已不存在二维循环定义,其修改后的脚本文件如下所示:
[0117][0118]
完成处理后,再执行步骤11;
[0119]
步骤11、识别次数i自加1,即当前识别次数i=1;
[0120]
步骤12、检测识别次数i不等于排列组合则说明在当前维度下尚有未被检测到的变量元素,需返回步骤5;
[0121]
第二轮抽取:
[0122]
步骤5、在有效变量序列中,放回式不重复抽取d个变量元素置于因变量集合sa中,设本轮因变量集合sa={a1,an};
[0123]
步骤6、遍历因变量集合sa中各变量对应表达式,并将所有表达式中自变量的并集置于自变量集合sb中;
[0124]
因变量集合sa中变量a2,an对应表达式分别为:a7*cos(an) 6a
n 1
4及a3*a
12
4ln(6) a8;
[0125]
则自变量集合sb={a3,a7,a8,a
12
,an,a
n 1
};
[0126]
步骤7、符号计算:
[0127]
fa=∑{a2,an}=a2 an;
[0128]
fb=∑{a3,a7,a8,a
12
,an,a
n 1
}=a3 a7 a8 a
12
an a
n 1

[0129]
步骤8、令δ=f
b-fa=a3 a7 a8 a
12
an a
n 1-a
2-an,即δ=a3 a7 a8 a
12
a
n 1-a2;
[0130]
步骤9、检测δ内部各符号元素存在符号
“‑”
(负号),即则说明因变量集合sa中的变量元素a2,an不存在二维循环定义,执行步骤11;
[0131]
步骤11、识别次数i自加1,即当前识别次数i=2;
[0132]
步骤12、检测识别次数i不等于排列组合则说明在当前维度下尚有未被检测到的变量元素,需返回步骤5;
[0133][0134]
第轮抽取:
[0135]
步骤5、在有效变量序列中,放回式不重复抽取d个变量元素置于因变量集合sa中,设本轮因变量集合sa={a2,a
n 1
};
[0136]
步骤6、遍历因变量集合sa中各变量对应表达式,并将所有表达式中自变量的并集置于自变量集合sb中;
[0137]
因变量集合sa中变量a2,a
n 1
对应表达式分别为:a7*cos(an) 6a
n 1
4及an 3a2 a
10

[0138]
则自变量集合sb={a2,a7,a
10
,an,a
n 1
};
[0139]
步骤7、符号计算:
[0140]
fa=∑{a2,a
n 1
}=a2 a
n 1

[0141]
fb=∑{a2,a7,a
10
,an,a
n 1
}=a2 a7 a
10
an a
n 1

[0142]
步骤8、令δ=f
b-fa=a2 a7 a
10
an a
n 1-a
2-a
n 1
,即δ=a7 a
10
an;
[0143]
步骤9、检测δ内部各符号元素不存在符号
“‑”
(负号),即sa∈sb,则说明因变量集合sa中的变量元素a2,a
n 1
存在二维循环定义,执行步骤10;
[0144]
步骤10、输出因变量集合sa中的变量元素a2,a
n 1
存在二维循环定义,并返回原始建模文档,由技术人员对其进行处理;
[0145]
本实施例假设对模型变量给予以下修改方案:
[0146]
对变量a2表达式修改为:a7*cos(an) 6a
n-2
4,对变量a
n 1
表达式修改为:an 7a8 a
10

[0147]
即a2=a7*cos(an) 6a
n-2
4,a
n 1
=an 7a8 a
10
,显然,此时变量a2与变量a
n 1
之间已不存在二维循环定义,则修改后的脚本文件如下所示:
[0148][0149]
完成处理后,再执行步骤11;
[0150]
步骤11、识别次数i自加1,即当前识别次数
[0151]
步骤12、检测识别次数i等于排列组合则说明在当前维度d=2下已完成所有不同组合的变量抽样,此时的脚本文件如下所示:
[0152][0153]
显然,在因变量集合sa的维度d=2下,识别完成后的各模型变量之间已不存在二维循环定义,执行步骤13;
[0154]
步骤13、检测因变量集合sa的维度d小于有效变量序列长度n,则说明尚未完成所有维度下变量集的识别检测,执行步骤14;
[0155]
步骤14、扩充因变量集合sa的维度,即因变量集合sa的当前维度d自加1,则当前维度d=3,并返回步骤4;
[0156]
步骤4、识别次数i清零,即当前识别次数i=0;
[0157]
因变量集合sa的维度d=3:
[0158]
第一轮抽取:
[0159]
步骤5、在有效变量序列中,放回式不重复抽取d个变量元素置于因变量集合sa中,设本轮因变量集合sa={a2,a3,an};
[0160]
步骤6、遍历因变量集合sa中各变量对应表达式,并将所有表达式中自变量的并集置于自变量集合sb中;
[0161]
因变量集合sa中变量a2,a3,an对应表达式分别为:a7*cos(an) 6a
n-2
4、2(4a5 a2) 3sin(a6)及a3*a
12
4ln(6) a8;
[0162]
则自变量集合sb={a2,a3,a5,a6,a7,a8,a
12
,an,a
n-2
};
[0163]
步骤7、符号计算:
[0164]
fa=∑{a2,a3,an}=a2 a3 an;
[0165]
fb=∑{a2,a3,a5,a6,a7,a8,a
12
,an,a
n-2
}=a2 a3 a5 a6 a7 a8 a
12
an a
n-2

[0166]
步骤8、令δ=f
b-fa=a2 a3 a5 a6 a7 a8 a
12
an a
n-2-a
2-a
3-an,即δ=a5 a6 a7 a8 a
12
a
n-2

[0167]
步骤9、检测δ内部各符号元素不存在符号
“‑”
(负号),即sa∈sb,则说明因变量集合sa中的变量元素a2,a3,an存在三维循环定义,执行步骤10;
[0168]
步骤10、输出因变量集合sa中的变量元素a2,a3,an存在三维循环定义,并返回原始建模文档,由技术人员对其进行处理;
[0169]
本实施例假设对模型变量给予以下修改方案:
[0170]
对变量a2表达式不做修改,对变量a3表达式修改为:2(4a5 7) 3sin(a6),对变量an表达式修改为:0.8a
n-1
*a
12
4ln(6) a8;
[0171]
即a2=a7*cos(an) 6a
n-2
4,a3=2(4a5 7) 3sin(a6),an=0.8a
n-1
*a
12
4ln(6) a8,显然,此时变量a2、变量a3及变量an之间已不存在三维循环定义,其修改后的脚本文件如下所示:
[0172][0173]
完成处理后,再执行步骤11;
[0174]
步骤11、识别次数i自加1,即当前识别次数i=1;
[0175]
步骤12、检测识别次数i不等于排列组合则说明在当前维度下尚有未被检测到的变量元素,需返回步骤5;
[0176][0177]
(类似地,采用该算法同样可以识别三维及以上维度的循环定义。)
[0178][0179]
当不断扩充因变量集合sa的维度d,使其等于有效变量序列长度n,即d=n 1时,并完成最高维度变量集的识别后,执行步骤13;
[0180]
步骤13、检测因变量集合sa的维度d等于有效变量序列长度n,则说明已完成所有变量元素的识别,跳转至步骤15;
[0181]
步骤15、识别完成后的有效变量及表达式以脚本文件的形式输出,如下所示:
[0182][0183]
识别处理完成,退出程序。
[0184]
输出的脚本文件将对内部的模型变量进行重排序后处理,后进一步导入计算机硬件系统平台并对各变量逐一计算输出。显然,经算法识别后,脚本文件中各模型变量已不存在循环/递归定义,其结果是使后续重排序有效处理,从而使模型递推计算能够持续进行。
[0185]
从实施过程的复杂程度分析,本发明提出的算法简洁明了,通过集合理论及符号计算原理可以准确地识别存在循环/递归定义的模型变量,且对比人工不断试探检测的识别方法,本发明提出的算法覆盖面更广,能够识别所有维度的循环定义,且识别精度高。
[0186]
需要说明的是,尽管以上本发明所述的实施例是说明性的,但这并非是对本发明的限制,因此本发明并不局限与上述具体实施方式中。在不脱离本发明原理的情况下,凡是本领域技术人员在本发明的启示下获得的其他实施方式,均视为在本发明的保护之内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献