⑴ 大学计算机 NS图算法求解
第一个:定义一个函数求n的阶乘,就是从1乘到n 然后弄个一个循环累加
第二个:穷举法:设各有a、b、c只,然后列举所有的abc使之等式成立,弄个三重循环就行了
第三个:参考网络
牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广泛用于计算机编程中。
double func(double x) //函数
{
return x*x*x*x-3*x*x*x+1.5*x*x-4.0;
}
double func1(double x) //导函数
{
return 4*x*x*x-9*x*x+3*x;
}
int Newton(double *x,double precision,int maxcyc) //迭代次数
{
double x1,x0;
int k;
x0=*x;
for(k=0;k<maxcyc;k++)
{
if(func1(x0)==0.0)//若通过初值,函数返回值为0
{
printf("迭代过程中导数为0!\n");
return 0;
}
x1=x0-func(x0)/func1(x0);//进行牛顿迭代计算
if(fabs(x1-x0)<precision || fabs(func(x1))<precision) //达到结束条件
{
*x=x1; //返回结果
return 1;
}
else //未达到结束条件
x0=x1; //准备下一次迭代
}
printf("迭代次数超过预期!\n"); //迭代次数达到,仍没有达到精度
return 0;
}
int main()
{
double x,precision;
int maxcyc;
printf("输入初始迭代值x0:");
scanf("%lf",&x);
printf("输入最大迭代次数:");
scanf("%d",&maxcyc);
printf("迭代要求的精度:");
scanf("%lf",&precision);
if(Newton(&x,precision,maxcyc)==1) //若函数返回值为1
printf("该值附近的根为:%lf\n",x);
else //若函数返回值为0
printf("迭代失败!\n");
getch();
return 0;
}
⑵ 15 个开源的顶级人工智能工具
斯坦福的专家在人工智能报告中得出的结论:"越来越强大的人工智能应用,可能会对我们的 社会 和经济产生深远的积极影响,这将出现在从现在到2030年的时间段里。"
以下这些开源人工智能应用都处于人工智能研究的最前沿。
1.Caffe
它是由贾扬清在加州大学伯克利分校的读博时创造的,Caffe是一个基于表达体系结构和可扩展代码的深度学习框架。使它声名鹊起的是它的速度,这让它受到研究人员和企业用户的欢迎。根据其网站所言,它可以在一天之内只用一个NVIDIA K40 GPU处理6000万多个图像。它是由伯克利视野和学习中心(BVLC)管理的,并且由NVIDIA和亚马逊等公司资助来支持它的发展。
2. CNTK
它是计算机网络工具包(Computational Network Tookit)的缩写,CNTK是一个微软的开源人工智能工具。不论是在单个CPU、单个GPU、多个GPU或是拥有多个GPU的多台机器上它都有优异的表现。微软主要用它做语音识别的研究,但是它在机器翻译、图像识别、图像字幕、文本处理、语言理解和语言建模方面都有着良好的应用。
3.Deeplearning4j
Deeplearning4j是一个java虚拟机(JVM)的开源深度学习库。它运行在分布式环境并且集成在Hadoop和Apache Spark中。这使它可以配置深度神经网络,并且它与Java、Scala和其他JVM语言兼容。
4.DMTK
DMTK分布式集齐学习工具(Distributed Machine Learning Toolkit)的缩写,和CNTK一样,是微软的开源人工智能工具。作为设计用于大数据的应用程序,它的目标是更快的训练人工智能系统。它包括三个主要组件:DMTK框架、LightLDA主题模型算法和分布式(多义)字嵌入算法。为了证明它的速度,微软声称在一个八集群的机器上,它能够"用100万个主题和1000万个单词的词汇表(总共10万亿参数)训练一个主题模型,在一个文档中收集1000亿个符号,"。这一成绩是别的工具无法比拟的。
5.H20
相比起科研,H2O更注重将AI服务于企业用户,因此H2O有着大量的公司客户,比如第一资本金融公司、思科、Nielsen Catalina、PayPal和泛美都是它的用户。它声称任何人都可以利用机器学习和预测分析的力量来解决业务难题。它可以用于预测建模、风险和欺诈分析、保险分析、广告技术、医疗保健和客户情报。
它有两种开源版本:标准版H2O和Sparking Water版,它被集成在Apache Spark中。也有付费的企业用户支持。
6.Mahout
它是Apache基金会项目,Mahout是一个开源机器学习框架。根据它的网站所言,它有着三个主要的特性:一个构建可扩展算法的编程环境、像Spark和H2O一样的预制算法工具和一个叫Samsara的矢量数学实验环境。使用Mahout的公司有Adobe、埃森哲咨询公司、Foursquare、英特尔、领英、Twitter、雅虎和其他许多公司。其网站列了出第三方的专业支持。
7.MLlib
由于其速度,Apache Spark成为一个最流行的大数据处理工具。MLlib是Spark的可扩展机器学习库。它集成了Hadoop并可以与NumPy和R进行交互操作。它包括了许多机器学习算法如分类、回归、决策树、推荐、集群、主题建模、功能转换、模型评价、ML管道架构、ML持久、生存分析、频繁项集和序列模式挖掘、分布式线性代数和统计。
8.NuPIC
由Numenta公司管理的NuPIC是一个基于分层暂时记忆理论的开源人工智能项目。从本质上讲,HTM试图创建一个计算机系统来模仿人类大脑皮层。他们的目标是创造一个"在许多认知任务上接近或者超越人类认知能力"的机器。
除了开源许可,Numenta还提供NuPic的商业许可协议,并且它还提供技术专利的许可证。
9.OpenNN
作为一个为开发者和科研人员设计的具有高级理解力的人工智能,OpenNN是一个实现神经网络算法的c++编程库。它的关键特性包括深度的架构和快速的性能。其网站上可以查到丰富的文档,包括一个解释了神经网络的基本知识的入门教程
10.OpenCyc
由Cycorp公司开发的OpenCyc提供了对Cyc知识库的访问和常识推理引擎。它拥有超过239,000个条目,大约2,093,000个三元组和大约69,000 owl:这是一种类似于链接到外部语义库的命名空间。它在富领域模型、语义数据集成、文本理解、特殊领域的专家系统和 游戏 AI中有着良好的应用。该公司还提供另外两个版本的Cyc:一个可免费的用于科研但是不开源,和一个提供给企业的但是需要付费。
11.Oryx 2
构建在Apache Spark和Kafka之上的Oryx 2是一个专门针对大规模机器学习的应用程序开发框架。它采用一个独特的三层λ架构。开发者可以使用Orys 2创建新的应用程序,另外它还拥有一些预先构建的应用程序可以用于常见的大数据任务比如协同过滤、分类、回归和聚类。大数据工具供应商Cloudera创造了最初的Oryx 1项目并且一直积极参与持续发展。
12.PredictionIO
今年的二月,Salesforce收购了PredictionIO,接着在七月,它将该平台和商标贡献给Apache基金会,Apache基金会将其列为孵育计划。所以当Salesforce利用PredictionIO技术来提升它的机器学习能力时,成效将会同步出现在开源版本中。它可以帮助用户创建带有机器学习功能的预测引擎,这可用于部署能够实时动态查询的Web服务。
13.SystemML
最初由IBM开发,SystemML现在是一个Apache大数据项目。它提供了一个高度可伸缩的平台,可以实现高等数学运算,并且它的算法用R或一种类似python的语法写成。企业已经在使用它来跟踪 汽车 维修客户服务、规划机场交通和连接 社会 媒体数据与银行客户。它可以在Spark或Hadoop上运行。
14.TensorFlow
TensorFlow是一个谷歌的开源人工智能工具。它提供了一个使用数据流图进行数值计算的库。它可以运行在多种不同的有着单或多CPU和GPU的系统,甚至可以在移动设备上运行。它拥有深厚的灵活性、真正的可移植性、自动微分功能,并且支持Python和c++。它的网站拥有十分详细的教程列表来帮助开发者和研究人员沉浸于使用或扩展他的功能。
15.Torch
Torch将自己描述为:"一个优先使用GPU的拥有机器学习算法广泛支持的科学计算框架",它的特点是灵活性和速度。此外,它可以很容易的通过软件包用于机器学习、计算机视觉、信号处理、并行处理、图像、视频、音频和网络等方面。它依赖一个叫做LuaJIT的脚本语言,而LuaJIT是基于Lua的。
欢迎关注~
微信公众号: IT百战程序员 ,免费提供人工智能、大数据、云计算等资料~~不管你在地球哪个方位,欢迎你的关注!
⑶ ANSYS划分网格用哪种算法
1 自由网格
就是使用ANSYS的网格工具,软件内部智能划分,对结构根据实际的建模来建立网格,一般都是满足计算的,特别是对于一些不太规则的模型,就可以使用这种方式,但是这种划分方式如果做不好,很容易出现较大的误差;
2 映射网格
这个里面的技术就多了,一般在网格的过程中首要选择它,但是这一般也是难度比较大的;这种技术可以首先对模型中的一些关键线来划分,然后映射到整个面,或者是体,从而形成网格,可是使用扫掠技术,就像楼上说的,但是这个掌握是比较困难的,也可以使用像VMESH等命令,也可以通过指定一些网格模式的方式,比如建立一个截面的网格,然后旋转,或者是拉伸,直接生成网格,等等,映射网格的技术是非常多的。
映射网格的好处就是建立的网格都是比较规则的,这样计算出来结果非常接近实际问题,而且可以根据做者的人的意愿建立生成一定的,确定的单元个数,从而可以加快后期计算速度等;另外,映射网格技术可以避免产生一些特别畸形的单元等,也是映射的好处。
3. 拖拉、扫略网格划分
对于由面经过拖拉、旋转、偏移(VDRAG、VROTAT、VOFFST、VEXT等系列命令)等方式生成的复杂三维实体而言,可先在原始面上生成壳(或 MESH200)单元形式的面网格,然后在生成体的同时自动形成三维实体网格;对于已经形成好了的三维复杂实体,如果其在某个方向上的拓扑形式始终保持一致,则可用(人工或全自动)扫略网格划分(VSWEEP命令)功能来划分网格;这两种方式形成的单元几乎都是六面体单元。通常,采用扫略方式形成网格是一种非常好的方式,对于复杂几何实体,经过一些简单的切分处理,就可以自动形成规整的六面体网格,它比映射网格划分方式具有更大的优势和灵活性。
4. 混合网格划分
混合网格划分即在几何模型上,根据各部位的特点,分别采用自由、映射、扫略等多种网格划分方式,以形成综合效果尽量好的有限元模型。混合网格划分方式要在计算精度、计算时间、建模工作量等方面进行综合考虑。通常,为了提高计算精度和减少计算时间,应首先考虑对适合于扫略和映射网格划分的区域先划分六面体网格,这种网格既可以是线性的(无中节点)、也可以是二次的(有中节点),如果无合适的区域,应尽量通过切分等多种布尔运算手段来创建合适的区域(尤其是对所关心的区域或部位);其次,对实在无法再切分而必须用四面体自由网格划分的区域,采用带中节点的六面体单元进行自由分网(自动退化成适合于自由划分形式的单元),此时,在该区域与已进行扫略或映射网格划分的区域的交界面上,会自动形成金字塔过渡单元(无中节点的六面体单元没有金字塔退化形式)。 ANSYS中的这种金字塔过渡单元具有很大的灵活性:如果其邻接的六面体单元无中节点,则在金字塔单元四边形面的四条单元边上,自动取消中间节点,以保证网格的协调性。同时,应采用前面描述的TCHG命令来将退化形式的四面体单元自动转换成非退化的四面体单元,提高求解效率。如果对整个分析模型的计算精度要求不高、或对进行自由网格划分区域的计算精度要求不高,则可在自由网格划分区采用无中节点的六面体单元来分网(自动退化成无中节点的四面体单元),此时,虽然在六面体单元划分区和四面体单元划分区之间无金字塔过渡单元,但如果六面体单元区的单元也无中节点,则由于都是线性单元,亦可保证单元的协调性。
5.利用自由度耦合和约束方程
对于某些形式的复杂几何模型,可以利用ANSYS的约束方程和自由度耦合功能来促成划分出优良的网格并降低计算规模。比如,利用CEINTF命令可以将相邻的体在进行独立的网格划分(通常是采用映射或扫略方式)后再"粘结"起来,由于各个体之间在几何上没有联系,因此不用费劲地考虑相互之间网格的影响,所以可以自由地采用多种手段划分出良好的网格,而体之间的网格"粘结"是通过形函数差值来进行自由度耦合的,因此连接位置处的位移连续性可以得到绝对保证,如果非常关注连接处的应力,可以如下面所述再在该局部位置建立子区模型予以分析。再如,对于循环对称模型(如旋转机械等),可仅建立一个扇区作为分析模型,利用CPCYC命令可自动对扇区的两个切面上的所有对应节点建立自由度耦合条件(用MSHCOPY命令可非常方便地在两个切面上生成对应网格)。
⑷ 常用的实时调度算法有( )和( )
#include<stdio.h>
int main()
{
int A,B; //标记进程A,进程B的到达时间
int cycA,cycB,serveA,serveB; //进程的周期时间和服务时间
float m;
int i,j,a=0,b=0,ka=0,kb=0; //ka,kb为开关,i,j,a,b为进程下标
int numa=0,numb=0; //服务累计时间
printf("输入进程A的周期时间,服务时间:");
scanf("%d%d",&cycA,&serveA);
printf("输入进程B的周期时间,服务时间:");
scanf("%d%d",&cycB,&serveB);
m=(float)serveA/cycA+(float)serveB/cycB;
for(int T=0;T<=100;T++)
{
if(m-1>1e-6)
{
printf("超出CPU的处理能力!\n");
return 0;
}
if(numa==serveA) //进程A完成
{
numa=serveA+1;
printf("当T=%d时",T);
printf("进程A%d结束\n",a);
if(numb<serveB)
{
printf(" 调用进程b%d\n",b);
kb=1;
}
ka=0;
}
if(numb==serveB)
{
numb=serveB+1;
printf("当T=%d时",T);
printf("进程B%d结束\n",b);
if(numa<serveA)
{
printf(" 调用进程A%d\n",a);
ka=1;
}
kb=0;
}
if(T%cycA==0 && T%cycB==0)
{
A=B=T;
j=++a;
i=++b;
printf("当T=%d时,进程A%d和进程B%d同时产生,此时,",T,j,i);
if(cycA<=cycB)
{
printf("调用进程A%d,阻塞进程B%d\n",j,i);
ka=1;
kb=0;
}
else
{
printf("调用进程B%d,阻塞进程A%d\n",i,j);
ka=0;
kb=1;
}
numa=numb=0;
}
if(T%cycA==0&&T%cycB!=0)
{
A=T;
printf("当T=%d时",T);
printf("进程A%d产生 ",++a); //不可能与进程A竞争处理器
numa=0;
if(numb<serveB) //进程B没有完成
if(B+cycB>A+cycA) //若进程B最早截止时间大于进程A的
{
printf("进程A%d执行。\n",a);
ka=1;
kb=0;
}
else //若进程B最早截止时间小于等于进程A的
printf("进程B%d继续执行。\n",b);
else //进程B完成
{
printf("进程A%d执行。\n",a);
ka=1;
}
}
if(T%cycA!=0&&T%cycB==0)
{
B=T;
printf("当T=%d时",T);
printf("进程B%d产生,",++b); //不可能与进程B竞争处理器
numb=0;
if(numa<serveA) //进程A没有完成
if(B+cycB>=A+cycA) //进程A的最早截止时间不小于B
printf("进程A%d继续执行。\n",a);
else
{
printf("进程B%d执行。\n",b);
kb=1;
ka=0;
}
else //进程A完成
{
printf("进程B%d执行。\n",b);
kb=1;
}
}
if(ka)
numa++;
if(kb)
numb++;
}
}