科学网

 找回密码
  注册
科学网 标签 Mathematica 相关日志

tag 标签: Mathematica

相关日志

一些关于MATLAB和Mathematica软件制图的问题
h2457528767 2018-10-5 17:23
1.对于Mathematica软件,输入 Plot 再输入下面的内容,对曲线进行优化, 即可得到 若要加上图例,则需要进行下面的优化, 可得曲线如下图所示, 2.对于MATLAB软件,则有, 运行可得 进行优化,即添加图例,需输入如下内容, 可得 输入以下内容,可设置横轴标签, 可得效果如下图, 再插入两条直线,如图 可得 可以通过图形编辑器对曲线的线条进行美化,即 即为最后的结果 这就是今天要介绍的内容了。
个人分类: 软件学习|2502 次阅读|0 个评论
立交桥布局中的曲线之美 (上)
热度 3 jiangxun 2018-6-23 10:11
作者:蒋迅 随着高速公路建设的飞速发展,我们在日常生活中所见到的高速公路立交桥越来越多,而且式样也是越来越多。立体交叉是车辆汇集、分叉和转向的核心部分。立交桥的设计的好坏直接影响到行车速度和行车安全。 1922年,法国著名的规划思想家、现代建筑运动创始人之一勒·柯布西埃( Le Corbusier )出版了一本《明天的城市及其规划》( The City of To-morrow and its Planning ),在城市规划研究中首先提出多层、高速的公路立体交叉的思想。现在,立体交叉已经从城市发展到了高速公路。高速公路上的互通式立交桥由高速公路的基本路段、立交桥、匝道、交织区、收费口、监控系统和服务设施组成了一个综合体系。 立交桥的设计不仅体现在它的科学性,也体现在它的美观性。美观的立交桥也会让机动车驾驶员感到有所是从和和有所准备,为驾驶更添一份安全因素。本文以立交桥布局设计中的曲线之美为线索,聊聊相关的数学知识,并用 和 这两个数学软件制图,为读者在以后的旅途中增加一些乐趣。 在公路运输领域里,交汇处通常使用立体化和一个或多个匝道(引道)来实现至少一条高速公路上的交通能通过交叉口而不直接穿过任何其他交通车流。在这里,立交桥扮演着重要的角色。最常见的四方向高速公路立交桥有苜蓿叶型、环状型、涡轮型、风车型和环路型等,另外还有它们的一些 混合型 。我们来一一介绍。由于国际上有靠右和靠左行驶两套系统,而且高速公路与铁路和市区公路也有立交,以下我们只考虑靠右行驶道路并只考虑有四个方向的高速汽车公路的立交桥设计。 2. 苜蓿叶立交桥型 最典型的是苜蓿叶型(cloverleaf interchange)。在这里“cloverleaf”,我们指的是“four-leaf clover”这种植物。苜蓿叶型也称为四叶型和幸运草型。典型的苜蓿叶型交汇有两层,这样使得所有原来需要穿越相交道路的转向都由环形匝道来避免,也就是说,让左转车辆行驶约270度的环道后自右侧切向汇入高速公路。这四条环形匝道就形成了苜蓿叶的形状。苜蓿叶型的优点在 于 它只需要一个立交桥,也就是两层交通。因此建设经费较少。但是这样的交叉口占地面积大,路线迂回较长。更严重的是两环间的路段也容易形成交织路段,直行车辆易受转向车辆干扰,影响了高速公路的运载能力。笔者曾经遇到一位老年妇女在直行道上想上环形匝道却又无法上去结果停在了直路中间,结果躲闪不及而追尾。 这种立交桥最早是美国新泽西州Woodbridge的两条道路交叉处。这也是世界上的第一座立交桥。该立交的平均通量为每昼夜达62500辆,高峰小时交通量达6074辆,即每分钟大约可容许100辆汽车通过。苜蓿叶式在全世界各地都很多。比如下面的南京绕城高速和玄武大道立交(图1(b))。 图1.(a) 苜蓿叶型立交桥的布局。(b)南京玄武大道立交 植物学上,“clover”是三叶草。在西方很多国家(如英国、美国)长有四片叶子的三叶草。四叶草是三叶草的稀有变种(图2(a))。据说大约一万至十万株三叶草中才会有一株是四叶的。西方人认为能找到四叶草是幸运的表现,在日本则认为会得到幸福,所以又称“幸运草”。人们对这四片叶子也赋予了含义。有一种说法是:第一片叶子代表希望(hope)、第二片叶子表示信心(faith)、第三片叶子是爱情(love)、而多出来的第四片叶子则是幸运(luck)的象征。 图2. (a) 四叶草。(b) 四叶玫瑰线。(c) r = 5cos( nθ ) 数学上,我们把这样的曲线叫做“四叶玫瑰线”( Quadrifolium )。它是由极坐标方程 生成的。显然这是当 n = 2 时的玫瑰线 r = a cos( nθ ) 。我们可以很容易地将“四叶玫瑰线”的极坐标方程转换成直角坐标方程 ( x 2 + y 2 ) 3 = 4 a 2 x 2 y 3 。所以它是一个几何亏格为零的代数曲线。但如果我们需要计算它所包含的面积的话,那么还是采用极坐标来计算为宜: 当我们考虑曲线的长度时,则需要用到第二类椭圆积分了。在这里我们只给它的近似值: s = 9.86884… a 。有人说它像是中国结,也有道理。 的表达式是 PolarPlot ,{t,0,2Pi}]。建议读者到 网站上去做出 r = 5cos( nθ ) 的图像并让 n 变动起来,看看能得到一些什么图像。用 做动态模拟时的表达式为: Manipulate ,{t,0,2Pi},PlotRange?5],{n,1,10}] 图2(c)是它的效果图。 3. 环状型立交桥 第二种立交桥是环状型(stack interchange)。环状型也称为定向式(directional interchange)。中文的“环状”与英文的“stack interchange”并没有直接的联系。“stack”的意思是堆,叠加的意思。取这个名字是因为环状型多为数层叠加的原因。所以翻译成“多级立交”更为合适。笔者更倾向于称之为定向式,因为它让左转的车辆保持了左转,而不会像上面苜蓿叶型那样通过右转来实现左转。左转和右转车辆都先从最右车道上匝道,然后二者分离,左转车辆到相对象限里汇入到那里的右转车辆所在匝道,然后一起并入住主车道。环状型立交没有苜蓿叶型容易产生车流交织的缺点,也无需做270度的转弯,但其立交桥层数多,一般多为三层,也有四层和五层的例子, 因此造价相对昂贵,也容易产生视觉上的景观冲击。笔者第一次见到这样的高速系统是在休士顿。那时候中国还完全没有高速公路的概念,所以见到这样的大型立交桥时觉得非常震撼。 第一座四层定向型立交桥在美国洛杉矶市,是州际I-10和US101的交汇处。它的第二、第四层为主干线,每层有六个车道;第一、第三层为左转匝道。其最上一层高出地面14.4米,最下层低于地面6.6米。干线设计车速96公里/小时,匝道设计车速55公里/小时,交通量达75000-100000辆/昼夜,耗资约280万美元。现在在中国也有这种立交模式,比如上海延安东路就有这样一座环状型立交桥(图3(b))。 图3.(a) 环状型立交桥的布局。(b) 上海延安东路的环状型立交桥 不同于苜蓿叶型立交桥,我们没有找到一条漂亮的数学曲线来代表这种形状的立交桥。最接近的应该是“内旋轮线”( Hypotrochoid )。给定一个半径为 R 的褂讪的大圆和一个内切于大圆的半径为 r 的小圆,从这个小圆的圆心出发做一个褂讪在小圆的射线,然后在这条射线上取一个点 P ,点 P 可以在小圆之外。点 P 到小圆中心的距离为 d 。当这个小圆沿着大圆的内边滚动时,点 P 的轨迹就叫作“内旋轮线”。这个曲线的参数方程是: 注意虽然我们把滚动的圆称为小圆,其实我们并不假定 r R 。三个参数 r , R 和 d 之间没有任何限制。它们甚至可以是负数。依据它们的取值的不同,我们可以得到许多不同形状的曲线。比如当 d = r = R /2 时,我们就得到一条线段;当 d = 0 时,我们就得到一个圆。下面是一组对应于不同的参数值 ( R , r , d ) 的“内旋轮线”。我们可以感受到这些曲线是多么地不同。 图4. 取不同参数时的内旋轮线。 内旋轮线在 中的一般表达式是 使用上面的表达式以及 中的 Table,ParametricPlot 和 Grid 等指令,我们就得到了上面的图4。 注意当 R = 1, r = 3/4, d = 5/13 时,“内旋轮线”最接近于环状型立交桥。所不同的是,立交桥的四个“叶子”是尖状的,而“内旋轮线”是光滑的。匝道在接入主线时必须是与主线相切地接入。 既然我们不能用一个数学方程来描述环状型,那么我们干脆把四个左转匝道单独出来,然后只看其中一段。其他匝道都可以通过旋转变换来实现。让我们单独出其中的由东向南的一段左转路线来。对 于 这样的路线,最好的数学公式恐怕是贝济埃曲线( Bezier curve )了。如下图所示,贝济埃曲线可以在给定的两个点上按一点的方向连接,而这正好是匝道接入主线时所要求的。 图5.(a) 环状型立交桥由东向南的一段。(b) 贝济埃曲线示意图。(c) Wolfram给出的一个图案。 Wolfram用贝济埃曲线做出了许多漂亮的 花型图案 。但这些图案都不能满足我们这里的要求(图5.(c))。 我们还可以再进一步,将上面的曲线做一个45 o 逆时针转轴。 于 是我们看到的是近似于一条椭圆曲线( elliptic curve )。数学上,椭圆曲线是一个由代数方程 定义的曲线。下面图6(b)是当 a = 1 和 b = 4 时的椭圆曲线,是用 制作的。用 制作也很简单,我们略过。基 于 椭圆曲线数学,人们开发了一种建 立公开密钥加密的算法 。 图6.(a) 做45 o 逆时针转轴后的一段匝道。(b) 当 a = 1 和 b = 4 时的椭圆曲线。 未完待续。
个人分类: 谈数学|12148 次阅读|3 个评论
Mathematica 应用于数学
jackyjjp 2017-4-15 13:59
一、基本代数运算( Cliff Hastings, 2015: chapter 14) 1. 基本运算 Expand函数 :展开表达式。 TrigExpand函数 :展开三角函数表达式。 Factor函数 :合并表达式。 Together函数 :合并分母。 Apart函数 :与Together的用途相反,把一个有理表达式改写成具有最小分母的项的和。 Collect 函数 :把匹配 x 的对象的相同幂的项组合到一起。 Simplify, FullSimplify函数 :简化表达式。 2. 解方程 Solve 函数 :解方程。可以通过 ReplaceAll函数 (或 /. 符号)提取解的具体值。 例如,Solve ,结果为 $\left\{\left\{x\to -\sqrt{2}-1\right\},\left\{x\to \sqrt{2}-1\right\}\right\}$ 而 results = x/.Solve 的结果为 $\left\{-\sqrt{2}-1,\sqrt{2}-1\right\}$ ,这一结果可以用于计算。例如,results*3^(1/3)。 Reduce 函数 :某些方程组有无数组解,Solve只能给出其中特定解,而Reduce能得到方程的一般解。通过求解关于 vars 的方程和不等式以及消除量词来约化表达式 expr。 FindRoot 函数 :求解方程组的在 x_0 附近的数值解。 对于方程 Sin -Cos ==0 上述三个函数返回的 x 的解并不相同。 二、微积分( Cliff Hastings, 2015: chapter 15) D函数或Dt函数 :求微分。例如,D ,{x,3}] 三阶微分。 也能用符号 ' 表示一阶微分,''表示二阶微分。例如,Sin' ,结果为 Cos 。 ' 号也能用于自定义函数。例如,f :=x^3-2*x^2-5*x+6,执行 f' 的结果为 -5-4*x+3*x^2。 能用于个变量的微分。例如,D ,x,y]。 也能用于未定义的函数。例如D ,x],结果为 g +x*g' 。此时,可以使用规则将未定义的函数替换为其他函数。例如,D *g'' ,x]/.g-Sin,结果为-2 x Cos Sin - Cos Sin 。 Limit函数 :求极限。例如,Limit 。 求左右极限的选项是 Direction-1 或 Direction--1。例如,Limit 。 给极限设定条件的选项是 Assumption。例如,Limit 。 Integrate函数或NIntegrate函数 :求积分,后者为求数值积分。例如,Integrate 。 求定积分:Integrate ,或者Integrate 。 求解多个变量的积分:Integrate 。 三、差分方程( Cliff Hastings, 2015: chapter 16) 四、线性代数( Cliff Hastings, 2015: chapter 17) 1. 矩阵操作 (1)生成矩阵 通过 Import函数导入矩阵数据 :Import ConstantArray函数 :构建所有元素都相同的矩阵。例如,ConstantArray }。 DiagonalMatrix函数 :将向量对角化。例如,DiagonalMatrix 。 ArrayFlatten : 将A, B, C, D四个nxn方形矩阵组合成一个2n x 2n矩阵,。 IdentityMatrix 函数 :生成nxn单位矩阵。 Transpose函数 :转置矩阵。 Inverse函数 :求逆矩阵。 SparseArray 函数:生成一个稀疏数组,posi 处的值为 vali。 从Excel中直接复制数据到Mathematica,见下图( 来源 ): (2)提取矩阵元素 Diagonal函数 :提取矩阵的对角元素。 通过 Part函数或 ] 符号提取矩阵元素 :Part ,或{1,2,3} ]。 通过 Span函数或 ;; 符号选取连续元素 :Part ,或{1,2,3} ] 通过 Take函数提取矩阵的前几行或几列 :Take 提取前两列;Take 提取前两行。 (3)给出矩阵特性 Dimensions 函数 :找出expr的维度,也就是矩阵的行数和列数。 Norm函数 :给出一个数字、向量或矩阵的模(范数)。 Det函数 :给出方阵的行列式。 RowReduce函数 :给出矩阵的行约化形式。 Eigenvalues函数 :给出方阵 m 的特征值构成的列表。 Eigenvectors函数 :给出矩阵 m 的特征向量列表.。 Eigensystem函数 :给出方阵的特征值和特征向量构成的列表 {values,vectors}。 (4)显示 MatrixForm函数 : 将矩阵显示为行列式形式。 注意:在给变量赋值时不要使用 MatrixForm 函数,否则出错。 2. 矩阵间的运算 Dot函数或 “ . 符号 :进行矩阵乘法:Dot or A.B。 Times函数或*符号 :将矩阵对应元素相乘:A*B。 Cross 函数 :计算a与b的向量叉积。 LinearSolve 函数 :求解矩阵方程 m.x==b的x。注意,Solve也可以用于求解对应的方程组,但是需要明确写出各个变量的名称。 3. 其他 AbsoluteTiming函数 :返回求解用时。 MatrixPlot函数 :矩阵画图。 (未完待续) 参考文献 Crista Arangala, 2015. Exploring Linear Algebra: Labs and Projects with Mathematica. Boca Raton, FL: CRC Press. Cliff Hastings, Kelvin Mischo, Michael Morrison, 2015. Hands-on Start to Wolfram Mathematica and Programming with the Wolfram Language. Champaign, IL: Wolfram Media, Inc.
个人分类: 学习|6939 次阅读|0 个评论
Mathematica 应用实例(持续更新)
jackyjjp 2017-4-11 09:00
问题:对于列表{1,2,3},想得到分成两个子列表的全部分法,比如{ {{1},{2,3}},{{1,2},{3}},{{1,3},{2}} }等等。问如何实现? 回答:Tuples ],2] ----------------- 问题:对于列表{1,2,3},想得到 恰好 分成两个子列表的全部分法,比如{ {{1},{2,3}},{{1,2},{3}},{{1,3},{2}} }等等。问如何实现? ( 出处 ) 回答:Needs Select , Length@# == 2 ]或者 KSetPartitions ----------------- 问题:已知A,B,C,D,四个3×3的矩阵,组装成6×6的矩阵。( 出处 ) 回答:ArrayFlatten ----------------- 问题:如何删除多维列表中的重复子列表?比如 { {1,2,3},{4,5,6}, {7,8,9},{1,2,3} }中删除{1,2,3},得到{ {1,2,3},{4,5,6}, {7,8,9} }。( 出处 ) 回答:DeleteDuplicates ----------------- 问题:你的父母正在考虑一项贷款期限30年、每月要支付0.5%利息的100000美元抵押贷款。试建立一个能够在360次付费后还清抵押贷款(借款)的用月供 p 表示的模型。 分析:如用 $a_n$ 表示 $n$ 个月后的剩余贷款,则可以得到如下关系:$a_n = a_{n-1}+0.005 \times a_{n-1}-p$,即当月的应还贷款额等于上月应还贷款额加上利息,并扣除偿还数 $p$。 方法一:利用递归列表求解Solve == a + 0.005*a - p, a == 100000}, a, {n, 2, 361}]]] == 0, p],结果为{{p - 599.551}}。 方法二:构建自定义函数 a = 100000; a := a = Simplify + 0.005*a - p]; (注:必须在:=右侧加上“a =”,目的是使计算结果固定在a 中,避免在每次循环时重复计算a ,这样很浪费时间。) Solve == 0, p] 结果为 {{p - 599.551}} 方法三:利用内置函数 Solve , 1.005^12 - 1, 0] == 100000, pmt],结果为{{pmt - 599.551}}。 -----------------
个人分类: 学习|6354 次阅读|0 个评论
Mathematica 与 MATLAB 互通 (利用 MATLink 实现)
jackyjjp 2017-4-7 16:44
Mathematica 与 MATLAB 是两大数学软件,各有强项。如果能将两者互通起来那该多好!这不,还真有一群人做了一款软件 —— MATLink ( http://matlink.org/ )。安装完后,就开用了。 (以下命令在Mathematica的Notebook中运行) 1. 启动软件 Needs OpenMATLAB %也就是以字符串的形式将命令传输到MATLAB执行,返回的结果也是字符串。 3. 在两个软件中传输数据 MGet函数 :从MATLAB获取变量数据。例如, mat = MGet 。 MSet函数 :将数据传给MATLAB。例如, MSet ] 。 4. 运行脚本及函数 MScript函数 :定义以下MATLAB脚本 timing.m。通过MEvaluate 或 MEvaluate ]运行。 t = MScript MFunction函数 :调用MATLAB 函数。如要调用MATLAB中的自定义函数,可先通过MScript定义,然后通过MFunction调用。 magic = MFunction ; magic // MatrixForm 更详细的 官方文档见这里 ,更多 案例见这里 。
个人分类: 学习|16104 次阅读|0 个评论
如何系统地学习 Wolfram Language (Mathematica)
jackyjjp 2017-4-5 21:19
机缘巧合,用了几次Wolfram|Alpha后被其强大折服,便对其了解了一番。发现背后是Wolfram Language (主要产品是 Mathematica) 在支撑。于是打算好好学习一番。 知乎上有这个问题及相应的回答 。其中,燕南(使用 Mathematica / Wolfram 語言约10年)的回答比较贴切。主要是通过两本书入门,然后通过不断的实践提升。 零基础入门: An Elementary Introduction to the Wolfram Language 。这本书着重讲Wolfram Language本身,并没有介绍在数学上的应用。 Hands-On Start to Wolfram Mathematica (Cliff Hastings et al., 2015)这本入门书有数学方面的介绍。 系统编程入门: Mathematica programming ﹣ An Advanced Introduction ,这本书也有网友翻译的中文版《 Mathematica 编程:高级导论 》。 实践实践再实践。 目前已初步学完一遍《An Elementary Introduction to the Wolfram Language》, 正在详细整理笔记 。下半年再深入学习《Mathematica programming ﹣ An Advanced Introduction》。
个人分类: 学习|6269 次阅读|0 个评论
Wolfram Language (Mathematica) 学习笔记
jackyjjp 2017-4-2 21:52
一、列表操作 列表(list)是Wolfram Language最基本的结构,掌握好列表的构建、处理及可视化,对于掌握好Wolfram Language 是事半功倍的。事实上,列表元素可以为任何Wolfram可识别的东西,比如数字、变量、字符串、图片及声音等。特别地,一维列表对应于数学上的 向量 ,等长的二维列表对应于 矩阵 。 1. 列表构建 (1)手动构建列表 直接录入,例如{1, 2, 3, 4, a, b, c}。 (2)自动构建列表 Table函数 :按照指定次数和指定值,生成某个函数的列表。例如,Table ,生成{x,x,x,x,x};Table ,{n,5}],生成{a , a , a , a , a }。 这个函数的用途很广泛,使用频率很高 。 生成多维数组(矩阵) :Table ,结果为{{x, x, x, x, x}, {x, x, x, x, x}, {x, x, x, x, x}, {x, x, x, x, x}}。生成乘法口诀表 Table ,结果为{{1, 2, 3, 4, 5}, {2, 4, 6, 8, 10}, {3, 6, 9, 12, 15}, {4, 8, 12, 16, 20}, {5, 10, 15, 20, 25}}。 Array 函数 :生成长度为 n、元素为 f 的列表。与Table类似,但更简洁。 生成3x4列表:Array ,结果 {f , f , f , f }, {f , f , f , f }, {f , f , f , f }}。 利用Times函数生成乘法表:Array 。 利用纯匿名函数:Array ,生成{1, 4, 9, 16, 25, 36, 49, 64, 81, 100}。Table 能得到相同的结果。 Manipulate函数 :生成交互式界面,根据用户选择的值生成相应结果元素。用法与Table函数类似,区别是Table ,{n,1,5}]中n默认是整数,而Manipulate ,{n,1,5}]中n是连续的数。 Range函数 :生成n以内的列表。例如,Range ,生成{1,2,3,4}。 --------------------- RandomInteger函数 :随机生成一组整数。例如,RandomInteger ,生成{5, 10, 0, 2, 7}(注:每次执行的结果可能不同)。 RandomChoice函数 ( 其实是 Tuples函数 结果的一个元素) :( 类似掷骰子 )从列表中一次抽取一个元素,抽取n次,列出一个随机的组合。例如,RandomChoice ,生成{a, b, a}(注:每次执行的结果可能不同)。 RandomSample函数 :(类似从扑克牌中抽取几张牌)从列表中随机选取若干元素,各元素最多被选中一次。例如,RandomSample , 5],生成{77, 55, 82, 72, 94}(注:每次执行的结果可能不同)。 --------------------- IntegerDigits函数 :将某个整数拆分为由各位数字组成的列表。例如,IntegerDigits ,生成{1, 9, 8, 8}。 FromDigits函数 :将列表整数数字组合为一个新的数字。例如, FromDigits ,生成5671。 --------------------- Permutations函数 :给出列表的所有可能排列。例如,Permutations ,生成{{a, b}, {b, a}}。 Subsets函数 :给出列表的所有可能子集(组合)。例如,Subsets ,生成{{}, {a}, {b}, {a, b}}。 Tuples函数 :( 类似掷骰子 )从列表中一次抽取一个元素,抽取n次,列出所有可能的组合。例如,Tuples ,生成{{a, a, a}, {a, a, b}, {a, b, a}, {a, b, b}, {b, a, a}, {b, a, b}, {b, b, a}, {b, b, b}}。 2. 列表拆分(提取)、合并、转置、排序、比较、定位、替换等处理 (1)拆分(提取) ----提取或舍弃 第一个 元素---- First函数(等价于 ]) :提取列表第一个元素。例如,First ,生成7。 Rest函数 : 舍弃 第一 个元素,保留其余元素。例如,Rest ,生成{6, 5}。 ----提取或舍弃 最后一个 元素---- Last函数(等价于 ]) :提取列表最后一个元素。例如,Last ,生成5。 Most函数 : 舍弃最后 一个元素,保留其余元素。例如,Most ,生成{7, 6}。 ----提取或舍弃指定位置元素---- Part函数 :提取列表 指定位置 的元素。例如,Part ,生成6。 ]记号 :提取列表 指定位置 的元素,功能同Part函数。 若括号中为负值,则表示从尾部开始计数。例如,{7, 6, 5} ],生成7。 用位置列表可以提取多个不同位置的元素。例如,{a, b, c, d, e, f, g} ],生成{b, d, e}。 用符号“   ;;   ”提取连续位置的元素,特别地, 1;;-1 等价于     All     ,表示所有元素。例如,{a, b, c, d, e, f, g} ],生成{b, c, d, e}。 可以提取 数组(矩阵) 的子列表(矩阵行)、矩阵列或元素。例如, 提取子列表 {{a, b, c}, {d, e, f}, {g, h, i}} ],生成{d, e, f}。 提取矩阵列 {{a, b, c}, {d, e, f}, {g, h, i}} ],生成{a, d, g}。 提取元素 {{a, b, c}, {d, e, f}, {g, h, i}} ],生成d。 也可用于未定义的函数表达式。例如,f ],生成 y。(Chapter 33) 提取图形坐标。例如,Graphics ] ],生成{0,0}。(Chapter 33) Take函数 :提取列表 前几位 (位置变量为正值)或 后几位 (位置变量为负值) 元素。例如,Take ,生成{101, 203, 401}。而Take ,生成{602, 332, 412}。 Drop函数 : 舍弃 列表 前几位 (位置变量为正值)或 后几位 (位置变量为负值) 元素。例如,Drop ,生成{602, 332, 412}。而Drop ,生成{101, 203, 401}。 ----提取最大最小元素---- TakeLargest函数 :提取列表中 最大 的几个元素。例如,TakeLargest , 5],生成{20, 19, 18, 17, 16}。 TakeLargestBy函数 :根据给定的 条件 提取 最大 的几个元素。例如,TakeLargestBy , StringLength, 5],生成{LXXXVIII, LXXXIII, XXXVIII, LXXVIII, LXXXVII}。 TakeSmallest函数 :提取列表中 最小 的几个元素。例如,TakeSmallest , 5],生成{1, 2, 3, 4, 5}。 TakeSmallestBy函数 :根据给定的 条件 提取 最小 的几个元素。例如,TakeSmallestBy , StringLength, 5],生成{C, X, L, I, V}。 Min函数(等价于TakeSmallest ) :提取列表的最小元素。例如,Min ,生成1。 Max函数 (等价于TakeLargest ) :提取列表的最大元素。例如,Min ,生成7。 ----归类分组---- Split函数 :将 连续相同的元素拆分 为子列表。例如,Split ,生成{{1, 1, 1}, {2, 2}, {1, 1}, {3}, {1, 1, 1}, {2}}。 Gather函数 : 打乱元素顺序 ,将相同元素归类到一起,生成子列表。例如,Gather ,生成{{1, 1, 1, 1, 1, 1, 1, 1}, {2, 2, 2}, {3}}。 GatherBy函数 :打乱元素顺序,将符合某种规则的元素归类到一起,生成子列表。例如,将所有字母归类(用LetterQ表示),GatherBy , LetterQ],生成{{I, t, s, t, r, u, e, t, h, a, t, i, s, e, q, u, a, l, t, o}, {', , , , 2, +, 2, , , , , 4, !}}。 Tally函数 :计算 list 中元素重复次数,并将元素及其次数列出。例如,Tally ,结果为{{a, 4},{b, 2},{c, 1}}。 (2)合并 Join函数 :合并若干列表。例如,Join ,生成{1,2,3,4,5,6}。 Riffle函数 :将某个元素插入到列表中各相邻元素之间。例如,Riffle ,生成{1, x, 2, x, 3, x, 4, x, 5}。 (3)重组、转置 Transpose函数 :将n x m列表转置为m x n列表。例如,Transpose ,生成{{1, 3, 5, 7, 9}, {2, 4, 6, 8, 10}}。 --------------------- Partition函数 :将某个列表重组为包含n个元素的若干个子列表。例如,将1 x 12列表重组为包含3个元素的列表,Partition , 3],生成{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}。另外,生成的3元素列表之间 还允许存在 重叠 ,例如,Partition , 3, 1],生成 {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}, {5, 6, 7}, {6, 7, 8}, {7, 8, 9}, {8, 9, 10}}。 Flatten函数 :与Partition的作用相反,将各子列表“ 拍平 ”为一个列表。例如,Flatten ,生成{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}。如果需要, 也可以仅去除一层列表 。例如,Flatten , {i, 4}, {j, 4}], 1 ],生成{{1}, {1}, {1}, {1}, {2}, {4}, {8}, {1, 6}, {3}, {9}, {2, 7}, {8,1}, {4}, {1, 6}, {6, 4}, {2, 5, 6}}。 ArrayFlatten函数 :与Flatten类似,用于数组。例如,将A, B, C, D四个nxn方形矩阵组合成一个2n x 2n矩阵,ArrayFlatten 。 --------------------- Thread函数 :将两个列表的元素关联起来,常用于生成Graph函数的输入值。例如,Thread ,生成{1 - 2, 3 - 4, 5 - 6, 7 - 8, 9 - 10}。 Reverse函数 :将列表倒置。例如,Reverse ,生成{3,2,1}。 Column函数 :将列表元素由行转置成列。 (4)排序 Sort函数 :按一定顺序排列列表元素,如果有多个子列表,那么安装子列表元素个数排列。例如,Sort ,生成{1, 2, 3, 4, 6}。 SortBy函数 :按某种规则排列列表元素。例如,按照子列表的第一个元素大小排列,SortBy , {n, 10}], First],生成{{1, 6}, {1, 2, 8}, {1, 0, 2, 4}, {2}, {2, 5, 6}, {3, 2}, {4}, {5, 1, 2}, {6, 4}, {8}}。 (5)比较 Union函数 :找出列表中的 不同元素 ,并按大小排列。例如,Union ,生成{1, 2, 3, 4, 5, 7, 8, 9}。 DeleteDuplicates函数 :(与Union函数类似)找出列表中的 不同元素 ,但不对结果进行排序。例如,DeleteDuplicates ,生成{1, 7, 8, 4, 3, 9, 2}。也可用于多维数组 DeleteDuplicates ,生成{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}。 Intersection函数 :找出各列表中的 公共 元素。例如,Intersection ,生成{1, 2, 3}。 Complement函数 :找出第一个列表中 不同于 其他列表的元素。例如,Complement ,生成{4, 5}。 (6)定位 Position函数 :找出给定元素在列表中的位置(坐标)。例如,Position ,生成{{2, 1}}。再例如,找出2^500中数字0的所有位置,Flatten , 0]]。 (7)替换 ReplacePart函数 :将 指定位置 的元素替换为新值,或 删除 。例如,ReplacePart ,生成{a, b, x, d, y, f, g}。 删除元素 ReplacePart ,生成{b, d, e, f, g}。 Nothing符号 :代表在一个列表或关联中将被自动移除的元素。 (8)元素信息统计 Total函数 :列表元素求和。例如,Total ,结果为6。 Length函数 :统计列表的元素个数(函数自变量的个数)。例如,Length ,结果为7。再例如,Length ]的结果为3。 Count函数 :统计列表中某个元素的出现次数。例如,Count ,结果为4。 3. 几个 列表间的加减乘除等运算 列表加减乘除等运算的原则是元素对应。例如: 加:{1, 2, 3} + 10 的结果为{11, 12, 13} 乘:{1, 1, 2}*{1, 2, 3}的结果为{1, 2, 6} 指数:Range ^2的结果为{1, 4, 9, 16, 25, 36, 49, 64, 81, 100} 矩阵乘:{1, 1, 2}.{1, 2, 3}的结果为 9。注:自动处理乘号右边的方向。 二、函数操作 1. 应用函数的各种方式( Chapter 25) f 方式 :意思是将函数 f 应用于 x。 f@x 方式 :与 f 方式等价,好处是避免使用方括号,提高代码的可读性。例如,f@g@h@x 的可读性要高于 f ]]。 x//f 方式 :将函数 f 放到 x 后面,与函数生效的顺序一致。例如,x // f // g // h 等价于 h ]]。 典型应用是计算数值解。例如,2 Pi^3 + 1 // N,结果为 63.0126。 f / @x 方式 :“/@”的含义是将函数 f 应用于 x 的每一个元素 (注:f 一般作用于 x 整体)。例如,f /@ {1, 2, 3},生成 {f , f , f }。但是,f 生成 f 。 更准确地讲, /@ 作用于其后函数的自变量部分 。例如,f/@g 的结果为g , f , f ]。 与 Map 函数 等价。例如,Map 生成 {f , f , f }。 f/@{a,b,c} 与 Table ,{x,{a,b,c}}] 等价 。 这种方式可另代码简洁。例如,Range /@ {3, 2, 5, 6, 7} 等价于 {Range , Range , Range , Range , Range }。 可罗列函数(listable functions) 会自动将函数 f 应用于 x 的每一个元素,因此不必额外使用“/@符号。这类函数有 N, Sqrt, Range, Prime 等。例如,N ,生成{0.333333, 0.25, 0.2, 0.166667}。 2. 纯匿名函数(Chapter 26, 29) f 形式 :这是纯匿名函数的基本形式。其中, # 代表 x 中的元素 ,n 代表函数 f 的选项, 表示之前的内容是纯匿名函数。例如,Rotate /@ {one, two, three}。 将“ f ”作为函数名使用 ,类似于 Table 中的Table 。因此纯匿名函数有以下几种形式: f ,或 f @x,x // f ,或 f /@x。 #可以作为函数选项, 但要用括号()将纯匿名函数包起来。例如,ColorFunction-(Hue )。 可以出现 多个 # 号 。例如,f /@ {a, b, c},生成 {f , f , f }。 #1, #2, #3.... 表示列表的第一、第二、第三....个元素。例如,Array 生成乘法表。 ## 表示提供给一个纯函数的 参数序列 。例如,f ,生成f 。 ## n 表示提供给一个纯函数的参数序列,从第 n 个参数开始。例如,f ,生成f 。 若有多个嵌套纯匿名函数 ,则为避免冲突,最好用括号() 区分各个函数。此外,有时必须使用 Function 代替 #^2。 FoldList函数 对纯匿名函数的应用比较典型(详见本章“3. 重复应用函数”)。 Function函数 :纯匿名函数的另一种形式,Function 与#^2等价。例如,Function 生成 3+x,Function 也生成 3+x。 为了提高代码的可读性,有时可以将Function 写为 x |-- x^2 。其中|--的输入方法为\ ,或者“Esc键” fn Esc键。 纯匿名函数的作用体现在两个方面。一是它是f/@x这种函数形式的基础。二是它能简化代码,避免重复。例如,Column , # }] ],其复杂形式是 Column , ColorNegate ], Blend }]。 3. 重复应用函数(Chapter 27, 29) NestList 函数 :将函数 f 作用于 expr 上 0 到 n 次 (嵌套 n 次),每一次都 基于 上一次的结果进行运算 ,给出结果列表。例如,NestList ,生成图2.3.1。 图2.3.1 NestList的结果示意图 Nest函数 :给出NestList函数的最后一个元素。 FixedPointList 函数:给出重复应用 f 的结果列表,从 expr 开始, 直到结果不再改变 。与NestList的作用相同,区别是不用指定重复次数。例如,FixedPointList , 1000],结果为 {1000, 501, 251, 126, 64, 33, 17, 9, 5, 3, 2, 2}。 FoldList 函数 :与NestList的功能类似,差别在于FoldList将 上一次结果连同下一个元素同时 输入函数 f ,即结果为{x,f ,f ,b],…}。例如,FoldList ] , x, {1, 2, 3, 4, 5}],生成图2.3.2。 这一函数在实际编程中常用于 渐进式累计某些值 。例如,求某个列表的累计求和列表,FoldList ,结果为{0, a, a + b, a + b + c, a + b + c + d, a + b + c + d + e}。 一个经典应用是 基于数字列表构建一个大数 (更简便的做法是使用FromDigits函数) 。 例如,FoldList ,生成{8, 87, 876, 8761, 87612, 876123, 8761239, 87612398, 876123987}。 FoldList的概念不容易理解,但是一旦弄明白了,就学会了函数式编程的一个重要技巧。 图2.3.2 FoldList的结果示意图 Fold函数 :给出FoldList函数的最后一个元素。 Accumulate 函数 :与FoldList 等价。 4. 模式 Patterns (1)一般模式 (Chapter 32, 41) 模式是Wolfram Language的一个核心概念,用下划线“_”表示,读作 blank,可表示任何东西。 x_ 或 x:_ 的意思是匹配任何东西,并将结果命名为 x。 这在 规则表达式 中十分重要,因为能通过这种方法 利用被代表物的一部分 。 x_是x:_的简写,更常用。 x:_一般用于表达复杂的模式。例如,尝试匹配两组包含两个元素的列表,grid22 := Grid 。 _h 中h指定了模式所匹配元素的头部信息(称为 Head)。例如, _Interger 表示被匹配的元素应当是整数, _List 表示列表。 /; 表示模式的条件。例如, n_Integer /;n0 表示匹配任何大于0的整数。 /; 可位于表达式的 任何位置 ,甚至是末尾。例如,check := Red /; x y 。 双点 x .. 或 Repeated 函数表示一个或多个表达式的序列,每个表达式匹配模式 x。例如,{{}, {a, a}, {a, b}, {a, a, a}, {a}} /. {a ..} - x,结果为 {{}, x, {a, b}, x, x}。 注意:当x..中的x元素为数字时,要加入空格避免与小数点混淆。例如 0 .. {_,_} 表示任何有两个元素的列表。而 {x_, x_} 表示有 两个相同元素 的列表。例如,Cases ,生成 {{h, h}, {c, c}}。 双下划线 “ __ ”表示任何东西的序列(一个或多个元素)。例如,Cases , g , {1, 2, 3}, f , f }, f ],生成{ f , f , f }。 三下划线 “ ___ ”表示无、一个或多个元素列表。例如,找出列表中黑、白色之间的元素,blackwhite := {m, m, m}。 默认情况下,__及___匹配最短的元素列表,可以使用 Longest 函数匹配最长元素列表 。例如,bwcut , b___}] := {{a}, Red, {b}}。 Cases函数 :找出列表中符合指定模式的所有元素。 例如,Cases , g , {1, 2, 3}, f , f }, f ],生成{ f , f , f }。 利用模式 找出元素并利用规则进行计算 ,Cases , g , f , f , g }, f - x + 10 ],生成{11, 12, 16}。 DeleteCases 函数 :删除 expr 中与 patt 匹配的所有元素。与Cases的作用相反。 模式的一大应用就是 定义替换表达式 。用“ /. ”(杠点)来定义替换表达式,用“ - ”来表示规则, 用“ : ”表示延迟应用规则 。 注意:若 /. 后接的是数字(比如0),那么必须在.点后 输入一个空格 ,以免与除法发生混淆。 将b元素替换为红色。{a, b, a, a, b, b, a, b} /. b - z ,生成 {a, z , a, a, z, z, a, z }。 可以用列表组合多个替换表达式。{{1, r}, {1, b}, {1, r, b}, {2, g, b}, {2, b}} /. {{1, _} - x, {__, b} - y} ,生成{x, x, y, y, y}。 形如 x_ 这类包含名称的模式在 规则表达式 中十分重要,因为能通过这种方法 利用被代表物的一部分 。例如,{f , g , f , f , g } /. f - x + 10,生成{ 11 , g , 12, 16 , g }。 应用实例: 利用模式_、替换/.、条件/;及规则-对列表元素排序,使用冒泡法(Bubble sort) 。 找到排序异常的首对元素,并调整它们的位置。代码:{5, 4, 1, 3, 2} /. {a___, b_, c_, d___} /; b c - {a, c, b, d}。 利用 FixedPointList 函数重复上述过程若干次就得到正确排序(不必指定重复次数)。代码:FixedPointList 。 延伸:利用Transpose找出各个位置上元素值的变化。代码:Transpose 。 延伸:利用ListLinePlot可视化上述结果。代码:ListLinePlot 。 (2)字符串模式及模板 (Chapter 42) 5. 表达式及其结构(Chapter 33) 在Wolfram Language中,任何东西都是符号表达式(Symbolic expression)。 符号表达式的基本组成称为原子( Atoms ),原子的主要种类有 数字、字符串及符号 。 x, y, f, Plus, Table 等都是符号,每个符号都有唯一的名字。 TreeForm函数: 显示表达式的树形结构。一般每个表达式都对应一颗“树”,树叶就是原子。 FullForm函数 :显示符号表达式的内部形式。例如,FullForm ,结果List , List ]。 Head函数 :获取表达式的头部信息。 在f 中,f 称为表达式的“ 头部信息 ”(Head),x和y称为 自变量 。 每个表达式,即使是原子,都有头部信息。在Wolfram Language中,大部分头部信息为Symbol。例如,Head 的结果为Integer,Head 的结果为 Symbol。 纯函数的头部信息为 Function。例如,Head 的结果为 Function。 运算符形式(Operator forms) :将A函数作为B函数的Head(头部信息)。 例如, Select ,结果为{4.5, 5, 6, 7.5, 8}。其中Select 就作为 Head。 很多函数的作用对象并不非得是列表,而是任意函数的自变量。例如,Length虽然可以统计列表元素个数,但它其实统计的是函数自变量个数(List也是一个函数啊)。而/@作用于函数的自变量。 通过 @@ 符号 替换表达式的 Head 。例如,f@@{x,y,z}生成 f 。例如,#1 - #2 @@ {x, y} 生成 x-y。例如,Rule@@{x,y} 生成 x-y。 通过 @@@ 符号 替换子列表的 Head (相当于联合使用 @@ 及 /@)。例如,f @@@ {{1, 2, 3}, {4, 5, 6}} 生成 {f , f }。 6. 关联数据结构(数据库)(Chapter 34, 45) 7. 给各种东西起个名字(Chapter 38) 8. 即时赋值及延后赋值(Chapter 39) 9. 自定义函数(Chapter 40) 通过 f := function 的形式自定义函数。其中,x_ 通过模式匹配输入值,:= 将function 的结果传递给 f 。 例如: 自定义阶乘函数。factorial = 1; factorial := n*factorial ,这里用到了 递归 的概念。 可只对符合条件的某些元素进行处理,原样保留其他元素。 对同一个函数可进行多次定义 。(1)模式越具体处理的顺序越靠前;(2)如果前一条规则不起作用,那么根据定义的先后顺序处理。下面的highlight函数优先对有框的元素处理。 highlight ] := Style , 20, Background - LightYellow] highlight := highlight /@ list highlight := Style , 20, Orange] 也可通过纯匿名函数定义 ,但很难处理输入变量的结构。例如,f=(#^2) 等价于 f :=n^2。 Clear 函数 :清除自定义函数 f 。 三、数字、字符串、单位、条件及自然语言识别 1. 数字 Chapter 23 RomanNumeral函数: 2.字符串及文字 Chapter 11 3. 单位 Chapter 17 4. 日期及时间 Chapter 19 5. 测试及条件 Chapter 28 6. 将自然语言转换为Wolfram Language能用的表达式 Chapter 35 四、可视化:颜色、样式、图形控件及图片 Chapter 7, 10, 8, 14, 37 1. 颜色及样式 2. 图形控件 ImageData函数 :获取图像的颜色像素值。例如,ImageData ]],生成{{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0}, {1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1}, {1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1}, {1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1}, {1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1}, {1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1}, {1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1}, {1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1}, {1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}。 RGBColor函数: Binarize函数: Image3D函数: ListAnimate函数: 3. 数据可视化 Chapter 24 ListPlot函数 :将列表中的数据点画在坐标轴个。例如,ListPlot ,生成图1.4.1。 图1.4.1 ListPlot生成的图 ListLinePlot函数 :将列表中的数据点连成线。例如,ListLinePlot ,生成图1.4.2。 图1.4.2 ListLinePlot生成的图 BarChart函数 :将列表中的数据画成柱状图。例如,BarChart ,生成图1.4.3。 图1.4.3 BarChart生成的图 PieChart函数 :将列表中的数据画成饼状图。例如,PieChart ,生成图1.4.4。 图1.4.4 PieChart生成的图 Grid函数 :将列表元素用网格的形式显示出来。例如,Grid , 9], Frame - All],生成图1.4.5。 图1.4.5 Grid显示的网格 ArrayPlot函数 :图形化数组。例如,显示 fractal Sierpinski pattern的8层分型图,ArrayPlot , {{1}}, 8]],生成图1.4.6。 图1.4.6 ArrayPlot生成的图 Framed函数 :给列表加上方框。例如,NestList ,生成图1.4.7。 图1.4.7 Framed生成的图 4. 图形网络(Graph and network) Chapter 21 5. 地理计算 Chapter 18 6. 内置函数选项 Chapter 20 五、存储、导入与导出数据 Chapter 43, 44 六、写出好的代码 Chapter 46, 47 七、高级内容 Chapter What We Haven't Discussed Inpaint函数 :去除图像水印、降噪或不想要的物体。 什么是高阶函数(higher-order functions) ?将其他函数作为输入值的函数,例如Array, FoldList, NestList等函数。 参考文献 Stephen Wolfram, 2015. An Elementary Introduction to the Wolfram Language. Wolfram Media, Inc. http://www.wolfram.com/language/elementary-introduction/
个人分类: 学习|10025 次阅读|0 个评论
利用Mathematica进行有限元编程(一):杆单元分析
qlearner 2016-8-17 16:19
首发: qixinbo.info 本文是对 Mathematica有限元分析与工程应用 一书的学习笔记。 这里的杆单元是总体坐标与局部坐标一致的一维有限元,因此不需要坐标变换,更易分析。 线性杆单元的形函数 线性杆单元的位移函数是坐标x的一次函数,可用以下代码求解: 1 2 3 4 Clear ; u = a1 + a2 x; solut = Solve ; u = u /. solut ] 其中u1和u2是杆端点x=0和x=1处的位移,结果为: 1 u1 + (-u1 + u2) x 形函数则可以通过取系数函数Coefficient获得: 1 NShape = {Coefficient , Coefficient } 结果为: 1 { 1 - x, x} 二次杆单元的形函数 二次杆单元的位移函数是坐标x的二次函数,求解代码为: 1 2 3 4 5 Clear ; u = a1 + a2 x + a3 x^ 2 ; solut = Solve ; u = u /. solut ] 结果为: 1 u1 + (- 3 u1 + 4 u2 - u3) x + 2 (u1 - 2 u2 + u3) x^ 2 其中u1、u2和u3分别是杆端点x=0、杆中点x=0.5、杆端点x=1处的位移。 那么形函数就是: 1 NShape = Coefficient 结果为: 1 { 1 - 3 x + 2 x^ 2 , 4 x - 4 x^ 2 , -x + 2 x^ 2 } 单元刚度矩阵 一次杆单元的刚度矩阵可以类比弹簧元的刚度矩阵。 设弹簧的刚度系数为k,节点i,j的位移分别为 u i ui 和 span class="MathJax" id="MathJax-Element-2-Frame" tabindex="0" data-mathml="math xmlns=http://www.w3.org/1998/Math/MathMLuj" role="presentation" style="display:inline;line-height:normal;text-align:left;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;padding:0px;margin:0px;position:relative;" u j uj ,受到的力分别为 span class="MathJax" id="MathJax-Element-3-Frame" tabindex="0" data-mathml="math xmlns=http://www.w3.org/1998/Math/MathMLFi" role="presentation" style="display:inline;line-height:normal;text-align:left;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;padding:0px;margin:0px;position:relative;" F i Fi , span class="MathJax" id="MathJax-Element-4-Frame" tabindex="0" data-mathml="math xmlns=http://www.w3.org/1998/Math/MathMLFj" role="presentation" style="display:inline;line-height:normal;text-align:left;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;padding:0px;margin:0px;position:relative;" F j Fj 。易知: span class="MathJax" id="MathJax-Element-5-Frame" tabindex="0" data-mathml="math xmlns=http://www.w3.org/1998/Math/MathML display=blockmtable columnalign=right left rowspacing=3pt columnspacing=0em displaystyle=trueFi=kui#x2212;kujFj=kuj#x2212;kui" role="presentation" style="display:inline;font-size:18px;text-align:left;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;padding:0px;margin:0px;position:relative;" F i F j = k u i − k u j = k u j − k u i Fi=kui−kujFj=kuj−kui 写成矩阵形式为: span class="MathJax" id="MathJax-Element-6-Frame" tabindex="0" data-mathml="math xmlns=http://www.w3.org/1998/Math/MathML display=block = " role="presentation" style="display:inline;font-size:18px;text-align:left;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;padding:0px;margin:0px;position:relative;" = = 所以单元刚度矩阵为: span class="MathJax" id="MathJax-Element-7-Frame" tabindex="0" data-mathml="math xmlns=http://www.w3.org/1998/Math/MathML display=blockkmrow class=MJX-TeXAtom-ORDij= " role="presentation" style="display:inline;font-size:18px;text-align:left;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;padding:0px;margin:0px;position:relative;" k i j = kij= 同理,一次杆单元的刚度矩阵为: span class="MathJax" id="MathJax-Element-8-Frame" tabindex="0" data-mathml="math xmlns=http://www.w3.org/1998/Math/MathML display=blockkmrow class=MJX-TeXAtom-ORDij=EAL " role="presentation" style="display:inline;font-size:18px;text-align:left;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;padding:0px;margin:0px;position:relative;" k i j = E A L kij=EAL 二次杆单元的刚度矩阵可通过能量法求解。应用能量法的示意图: 应变能为: span class="MathJax" id="MathJax-Element-9-Frame" tabindex="0" data-mathml="math xmlns=http://www.w3.org/1998/Math/MathML display=blockU=#x222B;mi mathvariant=normal#x03A9;12#x03C3;#x03F5;dV=#x222B;0L12EA#x03F5;2dx=#x222B;0L12EAaTdNTdxdNdxadx=12aTKa" role="presentation" style="display:inline;font-size:18px;text-align:left;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;padding:0px;margin:0px;position:relative;" U = ∫ Ω 1 2 σ ϵ d V = ∫ L 0 1 2 E A ϵ 2 d x = ∫ L 0 1 2 E A a T d N T d x d N d x a d x = 1 2 a T K a U=∫Ω12σϵdV=∫0L12EAϵ2dx=∫0L12EAaTdNTdxdNdxadx=12aTKa 其中: span class="MathJax" id="MathJax-Element-10-Frame" tabindex="0" data-mathml="math xmlns=http://www.w3.org/1998/Math/MathML display=block#x03C3;=E#x03F5;;#x03F5;=dudx=dNdxa,a=mo stretchy=false T" role="presentation" style="display:inline;font-size:18px;text-align:left;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;padding:0px;margin:0px;position:relative;" σ = E ϵ ; ϵ = d u d x = d N d x a , a = T σ=Eϵ;ϵ=dudx=dNdxa,a= T 所以单元刚度矩阵为: span class="MathJax" id="MathJax-Element-11-Frame" tabindex="0" data-mathml="math xmlns=http://www.w3.org/1998/Math/MathML display=blockK=EA#x222B;mrow class=MJX-TeXAtom-ORD0Lmo stretchy=false Tmo stretchy=false dx" role="presentation" style="display:inline;font-size:18px;text-align:left;word-spacing:normal;word-wrap:normal;float:none;direction:ltr;max-width:none;max-height:none;min-width:0px;min-height:0px;border:0px;padding:0px;margin:0px;position:relative;" K = E A ∫ L 0 T d x K=EA∫0L T dx 代入上面的形函数,那么求解代码为: 1 2 3 dNx = L D ; K = EA Integrate .{dNx}, {x, 0 , 1 }]/L; K // MatrixForm 注意:代码中的L这个系数是因为使用了之前位于0到1上的形函数,如果直接采用0到L,则形函数的具体形式会发生改变。 输出结果为: 模块分析 模块1:建立单元刚度矩阵 以下分别建立了弹簧元、线性杆单元、二次杆单元的单元刚度矩阵: 1 2 3 4 5 6 GenerateSpringKm := Module GenerateLinearRodKm := Module GenerateQuadraticRodKm := Module 模块2:组装整体刚度矩阵 以弹簧元为例,单独的一个弹簧元有两个节点,其单元刚度矩阵是2行2列的矩阵。对于含有n个节点的弹簧元系统,则是n行n列的整体刚度矩阵。组装过程为:假设某个弹簧元的节点的整体编号为i和j,其单刚中的四个元素要分别找到其对应的整体编号位置,然后叠加上去,即11对应ii,12对应ij,21对应ji,22对应jj。代码为: 1 2 3 4 5 6 7 GlobalK = 0 IdentityMatrix ; AssembleSpringKm := Module ], f ]]] += m ]; ]]; GlobalK] 代码中p1和p2是节点的整体编号(输入时要注意节点号的顺序),m是该单元的单刚,GlobalK是整刚。 二次杆单元的整体刚度矩阵则为: 1 2 3 4 5 6 7 8 AssembleQuadraticRod := Module ], f ]]] += m ]; ]]]; GlobalK] 建立好整体刚度矩阵后,代入边界条件,即可求出位移量,比如: 1 2 3 4 5 6 7 U = {u1x, u2x, u3x}; u1x = u3x = 0 ; F2x = 17.5 ; Load = {F1x, F2x, F3x}; tmp = Sort ]; unknown = Drop ; solut = Solve 这里使用的边界条件是编号1和3上的位移为0,2上的力为17.5,然后利用Solve求解。 模块3:得到单元应力 已知单元的位移向量u(在整体坐标系下的值),求单元上的力: 1 2 3 4 5 6 7 8 9 10 SpringElementForce := Module ; ]; RodElementForce := Module ; ] i是单元编号,u是位移向量,k是单刚。
个人分类: 编程学习|8414 次阅读|0 个评论
Mathematica版GetData——用Mathematica提取图片中的数据点
热度 1 qlearner 2016-6-9 20:53
首发: qixinbo.info 阅读文献时常常会遇到只给图像却没有原始数据的情形,此时如果想要提取数据,就得借助相应软件,目测用的最多的就是 GetData ,这个是个商业软件,还有个好用的基于web的开源软件 WebPlotDigitizer 。这里我们基于Mathematica写一套能用于提取图片中数据点的代码。 参考文献(基本思路参考SE上的这个问题,但具体取点和去点方式不同): Recovering data points from an image Attention:这里的版本强烈依赖于Mathematica的版本,此处使用的是10.4版本,目测应该使用10以上版本,因为低版本中不会出现工具提示条。 实际坐标系与图像坐标系的对应 首先使用工具提示条中的“坐标工具”提取已知点的图像坐标,然后选择“复制坐标”并保存(注意保存的数据中的点的先后顺序)。 如图: 利用这些图像中的坐标与实际坐标建立对应关系: 1 2 3 trans = FindGeometricTransform ]; 注意是实际坐标在前,图像坐标在后。 提取曲线颜色 要正确识别出图像中要提取的曲线,必须先让程序知道该曲线的颜色,即RGB值。这里依然使用工具提示条的“坐标工具”,提取曲线上一点后,选择“复制颜色值”。这里仅提取了一个点的RGB值,很难覆盖整条曲线,所以再设置一个忍量,使得与此RGB值相近的点都可以被识别: 1 2 3 4 5 6 7 8 objRGB = {{ 103 , 125 , 174 }}; tolRGB = 40 ; rangeRGB = Flatten / 255.0 ; img1 = ImageApply ] rangeRGB ] # ] rangeRGB ] # ] rangeRGB ] # ] rangeRGB ] # ] rangeRGB ] # ] rangeRGB ], { 0.0 , 0.0 , 0.0 }, { 1.0 , 1.0 , 1.0 }] , img] 此忍量的值可视情形调节。以上策略就是当某点的RGB值在忍量之内时,就变为(0.0,0.0,0.0),即黑色,否则则为白色(1.0,1.0,1.0)。 效果如图: 选区和去噪点 从上图可以看出,识别出的曲线中含有一些噪点,如果不处理掉就会影响结果。此时需要对图片进行精修,使其干净无污染。具体方法是采用工具提示条的“掩模工具”(话说10版本的MMA工具提示条真是逆天的存在),将要选择的区域勾勒出来,然后选择“逆掩模为一个图”,之所以是“逆掩模”,是因为要将这部分选出来而不是去除,也不选择“逆掩模为一个图像”,经测试选择“图”而不是“图像”,分辨率要更高。 逆掩模如图: 将此逆掩模的图放入下面代码中的Masking参数中即可: 1 curve = ImageApply 结果为: 可以看出噪点已经被去除。 提取数据点的位置 这一步就是提取上面曲线中的黑点的位置,代码为: 1 curvLoc = Reverse /@ Position , { 0. , 0. , 0. }]; 注意这里需要注意Position取得的位置是(1,1)在左上角,而图像坐标则是(1,1)在左下角,所以需要进行一系列变换,具体的变换规则如示意图: 作图并与解析解作对比 实际要提取的曲线是有具体的表达式的,此处将提取出的数据与解析表达式对比: 1 Show ,Plot ] 结果为: 可以看出效果还不错。 目前还是以代码的形式操作,以后没准能有图形界面? 以上。
个人分类: 编程学习|10483 次阅读|2 个评论
Mathematica版GetData——用Mathematica提取图片中的数据点
qlearner 2016-6-9 20:52
首发: qixinbo.info 阅读文献时常常会遇到只给图像却没有原始数据的情形,此时如果想要提取数据,就得借助相应软件,目测用的最多的就是 GetData ,这个是个商业软件,还有个好用的基于web的开源软件 WebPlotDigitizer 。这里我们基于Mathematica写一套能用于提取图片中数据点的代码。 参考文献(基本思路参考SE上的这个问题,但具体取点和去点方式不同): Recovering data points from an image Attention:这里的版本强烈依赖于Mathematica的版本,此处使用的是10.4版本,目测应该使用10以上版本,因为低版本中不会出现工具提示条。 实际坐标系与图像坐标系的对应 首先使用工具提示条中的“坐标工具”提取已知点的图像坐标,然后选择“复制坐标”并保存(注意保存的数据中的点的先后顺序)。 如图: 利用这些图像中的坐标与实际坐标建立对应关系: 1 2 3 trans = FindGeometricTransform ]; 注意是实际坐标在前,图像坐标在后。 提取曲线颜色 要正确识别出图像中要提取的曲线,必须先让程序知道该曲线的颜色,即RGB值。这里依然使用工具提示条的“坐标工具”,提取曲线上一点后,选择“复制颜色值”。这里仅提取了一个点的RGB值,很难覆盖整条曲线,所以再设置一个忍量,使得与此RGB值相近的点都可以被识别: 1 2 3 4 5 6 7 8 objRGB = {{ 103 , 125 , 174 }}; tolRGB = 40 ; rangeRGB = Flatten / 255.0 ; img1 = ImageApply ] rangeRGB ] # ] rangeRGB ] # ] rangeRGB ] # ] rangeRGB ] # ] rangeRGB ] # ] rangeRGB ], { 0.0 , 0.0 , 0.0 }, { 1.0 , 1.0 , 1.0 }] , img] 此忍量的值可视情形调节。以上策略就是当某点的RGB值在忍量之内时,就变为(0.0,0.0,0.0),即黑色,否则则为白色(1.0,1.0,1.0)。 效果如图: 选区和去噪点 从上图可以看出,识别出的曲线中含有一些噪点,如果不处理掉就会影响结果。此时需要对图片进行精修,使其干净无污染。具体方法是采用工具提示条的“掩模工具”(话说10版本的MMA工具提示条真是逆天的存在),将要选择的区域勾勒出来,然后选择“逆掩模为一个图”,之所以是“逆掩模”,是因为要将这部分选出来而不是去除,也不选择“逆掩模为一个图像”,经测试选择“图”而不是“图像”,分辨率要更高。 逆掩模如图: 将此逆掩模的图放入下面代码中的Masking参数中即可: 1 curve = ImageApply 结果为: 可以看出噪点已经被去除。 提取数据点的位置 这一步就是提取上面曲线中的黑点的位置,代码为: 1 curvLoc = Reverse /@ Position , { 0. , 0. , 0. }]; 注意这里需要注意Position取得的位置是(1,1)在左上角,而图像坐标则是(1,1)在左下角,所以需要进行一系列变换,具体的变换规则如示意图: 作图并与解析解作对比 实际要提取的曲线是有具体的表达式的,此处将提取出的数据与解析表达式对比: 1 Show ,Plot ] 结果为: 可以看出效果还不错。 目前还是以代码的形式操作,以后没准能有图形界面? 以上。
个人分类: 编程学习|8153 次阅读|0 个评论
Mathematica 与 Visual Studio
yanqiaokai 2015-11-26 00:41
Mathematica 10.3 VisualStudioCompiler.m $VisualStudioVersions = { 2015, 2013, 2012, 2010, 2008, 2005} installPath := installPathFromEnvironment installPath := installPathFromEnvironment installPath := installPathFromEnvironment installPath := installPathFromEnvironment installPath := installPathFromEnvironment installPath := installPathFromEnvironment
3257 次阅读|0 个评论
Mathematica工作日志
qianlivan 2014-1-16 10:24
20140118 使用GRTensorM grii/grt.m 初始化坐标、基矢和度规(“sphere3d”只是一个名字,随后要在弹出窗口中输入各种参数) makeg ConnectionExample.nb.pdf 20140116 使用Ricci Ricci.m 定义丛(切丛) DefineBundle 定义各种张量(场)(包括标量、矢量、余矢、微分形式) DefineTensor DefineTensor DefineTensor DefineTensor 求张量(场)的全导数 Del 正如几何语言中那样,张量是不带(具体)指标的,需要指定指标 % ,L ] 或者可以进行基底展开(其中N是Del 对应的公式号) BasisExpand 20140115 Mathematica输入命令是Shift+Enter,不是Enter,也不是Ctrl+Enter。
个人分类: 知识|4709 次阅读|0 个评论
Mathematica 微积分
nadia1989 2013-6-21 17:47
微积分 偏微分D ,D 多重偏微分D 全微分Dt ,Dt 多重全微分Dt 求隐函数的导数 In := Dt == x^2, x] Out = 10 y Dt + Cos Dt == 2 x In := Solve ] Out = {{Dt - (2 x)/(10 y + Cos )}} 积分 积分Integrate 1}] 多重积分Integrate }] 第一重积分在最后面 数值积分 Nintegrate ; 数值积分 Nintegrate ,以x1,x2...为分割求 上的数值积分 解微分方程 (*y 与 y的区别*) In := DSolve == 2 y , y , x] Out = {{y - E^(2 x) C }} In := DSolve == 2 y , y, x] Out = {{y - Function ]}} (*一元二次方程*) In := DSolve + 2 y' + y == 0, y , x] Out = {{y - E^-x C + E^-x x C }} (*二元一次方程*) In := DSolve == -z' , z == -y' }, {y , z }, x] Out = {{y - 1/2 E^-x (1 + E^(2 x)) C - 1/2 E^-x (-1 + E^(2 x)) C , z - -(1/2) E^-x (-1 + E^(2 x)) C + 1/2 E^-x (1 + E^(2 x)) C }} (*带初始条件解微分方程*) DSolve == y , y == 5}, y , x] Out = {{y - 5 E^x}} In := DSolve == y , y' == 5}, y , x] Out = {{y - E^-x (-5 + C + E^(2 x) C )}} 数值解微分方程 s = NDSolve == y ^2, y == 1}, y, {x, 0, 1}] Plot /. s], {x, .01, 1}]
个人分类: Mathematica|2948 次阅读|0 个评论
在matlab中调用mathematica的函数
热度 1 ylyy779530170 2013-3-28 17:37
matlab的矩阵运算非常强大,而mathematica的数学函数比较丰富,为了将二者的优点结合起来,在此介绍在matlab中调用mathematica中函数的方法。 实验平台 1.win764位旗舰版 2.matlab2012a 3.mathematica9.0中文版 4. MathematicaSymbolicToolboxforMATLAB--Version2.0 具体步骤 1.确认已经安装好Matlab和mathematica。 2.对于32位系统,将目录C:ProgramFilesWolframResearchMathematica9.0SystemFilesLinksMathLink DeveloperKitWindowsCompilerAdditionsmldev32include中的mathlink.h和目录C:ProgramFilesWolfram ResearchMathematica9.0SystemFilesLinksMathLinkDeveloperKitWindowsCompilerAdditionsmldev32 lib中的ml32i1m.lib文件复制到一个新的文件夹。注意此方法未验证,需要32位版本的网友请自行测试。 对于64位系统,将目录C:ProgramFilesWolframResearchMathematica9.0SystemFilesLinksMathLink DeveloperKitWindows-x86-64CompilerAdditionsmldev64include中的mathlink.h和目录C:ProgramFiles WolframResearchMathematica9.0SystemFilesLinksMathLinkDeveloperKitWindows-x86-64CompilerAdditionsmldev64lib中的ml64i3m.lib复制到一个新的文件夹。注意lib文件夹中有多个问题,可能对应于不同的处理器型号,可以随便选择一个能通过下面的编译即可。在本例中,我们将以上两个文件放入C:mathematica_for_matlab目录。 3.将下载好的MathematicaSymbolicToolboxforMATLAB--Version2.0文件中的math.c和mathrun.m也放入同一文件夹。 4.对于64位的matlab,默认是不安装C语言编译器的。对于32位,默认安装的是lcc,无法编译对应的math.c文件。所以,无论32位还是64位,推荐下载免费的 MicrosoftWindowsSDK7.1 ,同时需要安装 .NETFramework4.0 。如果安装过程中出现问题,可以参照 http://blogs.msdn.com/b/windowssdk/archive/2009/09/16/windows-7-sdk-setup-common-installation-issues-and-fixes.aspx 。 5.打开matlab,输入mex-setup,选择对应的编译器,配置成功后,运行mathrun.m文件。编译成功后会出现math.mexw64文件。这样就可以使用了。 6.打开testscript.m文件进行测试。此时我们就可以使用math('')的方法来调用mathematica的函数了,注意在运行时,会弹出一个对话框,此时需要选择C:ProgramFilesWolframResearchMathematica9.0文件下的math.exe程序。 Enjoyit!! 示例: clearall clc tic x=0:0.1:50; y1=zeros(1,length(x)); ii=1; forii=1:length(x) math('matlab2math','x',x(ii)); ytemp=math('BesselJ '); y1(ii)=str2double(ytemp(3:end-2)); end figure(1) x=0:0.1:50; plot(x,y1,'r') math('quit') toc tic x=0:0.1:50; y2=besselj(0,x); figure(2) plot(x,y2,'.b') toc 运行结果: MathematicaKernelloading... MathematicaKernelquittingperyourrequest... Elapsedtimeis2.207739seconds. Elapsedtimeis0.079728seconds. 参考资料: 1.http://www.mathworks.cn/support/compilers/R2012a/win64.html mathematica_for_matlab.rar
6918 次阅读|1 个评论
Mathematica处理分子云数据的可能性(三)二维图像显示
qianlivan 2012-12-26 09:14
数据处理的另外一项重要的操作就是显示二维图像。前面已经提到( http://blog.sciencenet.cn/home.php?mod=spaceuid=117333do=blogid=641804 ),用Mathematica读入FITS文件并不困难。直接用Import函数就可以了。比如(假设FITS文件是二维图像,三维图像(数据块)也容易转化为二维图像的情况) a=Import 这样读进来的严格说不是图像本身,而是以图像为元素的数组,我们感兴趣的是其中的元素,即图像本身。可以加一个指标得到图像本身 a=Import ] 在实际工作中,除了显示图像,我们还希望能对图像进行标注,主要是加一个边框,标注上坐标。原则上这是容易实现的,就是把Plot画出的图和二维图像对齐叠画就行了。但是,实际的参数要摸索一下。看了Plot的文档之后发现,类似IDL,Plot可以不画数据,只画边框。IDL中是加一个参数 /NoData,而Mathematica更直接,把表达式的地方空着就行了。 p=Plot 其中Frame-True指定了要画出边框,否则只有坐标轴。但是这样画出来的框是固定大小的,无法和之前读入的图像匹配,还需要指定图像的大小和长宽比。 p=Plot 其中nx,ny是图像的长和宽的像素数。随后就可以叠画了。 Overlay 但是这样是有问题的,因为读入图像默认是沾满整个“图像区域”的,而边框是不沾满整个图像区域的,因为边框下面还有标注什么的。于是我们还需要另外一个参数指定边框所占范围以及图像所占范围,这两个范围应该一致。这个参数就是ImagePadding(图像填充)。 a=Import ] p=Plot 这样之后再 Overlay 就可以把图像对齐了。其中ImagePadding后面的四个参数分别表示四个页边距。使用Export就可以生成图像文件。 Export ]
个人分类: 知识|4417 次阅读|0 个评论
Mathematica处理分子云数据的可能性(二)确定列表元素位置
qianlivan 2012-12-12 13:31
上回说到要是能根据关键词确定数组指标就更好了(http://blog.sciencenet.cn/home.php?mod=space uid=117333do=blogid=641804)。经过搜索发现,Position函数可以实现这一点。 对于 header=Import 得到的header列表,要得到NAXIS3所在的行数,尝试 c=Position 得到 {{6,1}} 再尝试 d=c ] ] 就得到行数6了。这样就可以结合之前用Mathematica读FITS文件数据的操作进行些简单的数据处理了。比如说得到(x,y)=(10,9)处的频谱 a=Import ; header=Import ; c=Position ; d=c ] ]; nz=header ] ] ]; spec=a ,9,10]];
个人分类: 知识|3874 次阅读|0 个评论
Mathematica处理分子云数据的可能性(一)读FITS文件
qianlivan 2012-12-12 11:16
前面说过,Mathematica已经不再是简单的计算工具(http://blog.sciencenet.cn /home.php?mod=spaceuid=117333do=blogid=637954),其知识库和三维图形显示功能以及精确的计算都十分吸引人。 之前我们大多用IDL(或者CLASS之类的软件)处理分子云数据,由于大多数研究人员都使用这些工具,所以碰到问题有人可以问,而且已经积累了很多方便的专用工具。但是这些工具的三维显示都不尽如人意,真实感比较差,看起来很费劲。我一直在考虑是否可以用Mathematica这样的工具处理数据,但是由于用这种工具处理数据的人不多,碰到问题可能没人问,所以一直对此有顾虑。Wolfram北京大会之后,我觉得无论如何得试一试用 Mathematica处理数据,因为三维图形显示对于目前的研究已经变得很重要了。 数据处理的第一步是读数据,分子云数据大多是FITS格式的。之前知道Mathematica可以读入FITS文件,但是我的感觉是,似乎只对二维FITS文件有效。上网查,很多人也说似乎对三维FITS文件有问题,这导致我有些畏手畏脚。 昨天事少,决定不管网上的评论,自己试一试。其实用Mathematica读数据文件是比较方便的,各种格式都用一个函数,Import,不像IDL那样对不同的格式用不同的函数。直接读入一个三维FITS文件 a=Import 并没有像网上说的那样出错,只不过得到不是数据,而是一系列图像。上网搜了一下,发现可以加一个选项得到原始数据 a=Import 经过测试发现,a是一个三维数组,但是和用IDL读出的数组有些不同,如果IDL读出的数组的三维分布是x,y,z,那么Mathematica读出的数组的三维是z,y,x。并且,Mathematica数组的指标是从1开始的,不像IDL那样从0开始。 于是从FITS文件读数据的问题基本解决了。但是FITS文件还有另外一个重要的部分——头文件,这也是需要读出来的。网上搜了一圈,都是在问怎么读头文件的。其实读出头文件本身并不困难,只要把上面Import中第二个参数改为“Metadata”就可以了。 header=Import 但是这样得出的是一个非常复杂的列表,里面有各种单词,箭头,括号等。不过Mathematica的好处在于,数组、列表什么的其实都是同一种数据结构,所以可以自己方便地进行尝试。尝试 header ] 输出的是 SIMPLE-{True,} 也就是头文件的第一项(行)。我希望得到的是NAXIS3的值,NAXIS3在第6行,尝试 header ] 输出的是 NAXIS3-{228,} 但是我实际想得到的是228这个数,再尝试一下 header ] ] 得到的是 NAXIS3 尝试 header ] ]得到的是 {228,} 再尝试 header ] ] ] 就得到 228了。这样就解决了读FITS头文件的问题。当然,其实还需要研究一下怎么用关键词直接读出数值,而不用数关键词所在的行数。
个人分类: 知识|6225 次阅读|0 个评论
2012年Wolfram北京大会参会总结
热度 2 qianlivan 2012-11-30 21:38
上大学的时候就知道有3M:Maple、Matlab和Mathematica。我的本科毕业论文是一个理论的题目,有很多符号推导。我知道Maple和 Mathematica的符号推导功能很强大(Matlab的符号推导用的是Maple的内核),但是二者的语法在我当时看来都难以接受,和传统的编程语言差别比较大,而且代码和输出混在一起,感觉很乱。所以我用了Matlab完成了我的毕业论文,但是也比较费劲,原因是Matlab的公式显示功能很差劲,不要说优雅,能看懂都很费劲,因为Matlab是用常规字符显示公式的,而不像Maple、Mathematica那样用LaTeX(Matlab后 来似乎也有latex函数的,但是总之是不太好用)。 经过了许多年,Maple的声音似乎越来越微弱了。现在很多人在用Matlab,很大一部分是用于工程(用simulink),也有不少人在用 Mathematica,主要用于求解一些常规方法难以处理的方程。总体感觉是Mathematica是基于数学的,更像是一种数学工具,而Matlab 感觉更像是编程语言。 前段时间收到一封邮件,说今年11月30日有一个Wolfram大会,其中一个演讲人是云南天文台的林隽研究员。我知道林老师的一个重要贡献是太阳爆发的理论模型,但是没有想到他会用到Mathematica。因为有天文工作者参会作报告,所以我决定去看看。 事实证明,今天参会是明智的。从会议中了解了很多新的信息和新的想法。 首先是Mathematica 9已经于昨天发布了,比起我上大学时的Mathematica,这一版非常容易使用,输入的时候有提示。计算完成后会提示下面要做的操作,几乎不需要记命令。这一版还部分支持了自然语言,让整个操作变得十分简单,完全没有接触过Mathematica的人也非常容易上手。 接下来听到的是清华的顾学雍老师的报告,他讲了分布式学习,以及如何借助Mathematica和Wolfram Alpha实现分布式学习。实际的案例是让一群不知道单片机为何、机械知识缺乏的人在四天时间内制作一个用单片机控制的太阳系行星模型,并记录整个过程, 制作视频。我第一次发现,Mathematica不只是一个软件,它后面有Wolfram Alpha这个知识库的支持,使得它变得非常强大,这恐怕是其他任何编程语言无法比拟的。 原北京市科委的李易洋报告了他以前做的一些演示程序。其中有三个比较有趣:叶脉、黏菌运动和海洋内波。最后一个我不是太懂,叶脉和黏菌运动很有趣。叶脉是 一个非常高效的运输系统,现有的任何算法都无法设计出这样一个高效的算法。我们不得不感叹大自然的力量。黏菌的运动也是非常奇妙的。日本研究人员按照东京及周围城市的实际分布缩尺建立了一个模型,在这些“城市”的位置放上黏菌的食物,然后放上黏菌。过了一段时间以后,黏菌就在这些“城市”之间建立了一些 (由黏菌组成的)道路(连接),而没有道路的地方已经没有黏菌了。这些道路是黏菌输送食物的,是非常高效的。如果按照这些连接来修建东京以及周围城市之 间的道路,也将形成一个非常高效的运输系统。我之前知道可以用物理系统求解数学问题,这可以算是用生物系统求解数学问题吧。 北师大的张江老师提到了Wolfram Alpha中的Country Data,其中有世界各国的104项指标(GDP、人口等等),这些数据在别的地方都很难获得。张老师用Mathematica演示了鸟群的Boid模型 和Levy飞行模型,还提到有一个积分的计算,用Matlab算不出来,用Mathematica就可以进行高精度的计算。 此外,还听到了之前不知道的Modelica。听过今天的报告,再回头看,我开始有点理解Mathematica的理念了,如果一个算式就可以解决问题, 其实没必要写成一个程序。Wolfram公司组织的one line contest大概是这个理念的一个体现。 2012年12月4日补记 我上面所记关于挑战式学习的内容和顾老师的原意有出入,现将顾老师的来信附后。在此对这篇博客的不准确向顾老师表示抱歉。 ========================================================= 顾老师来信 ========================================================= 钱老师: 由于由几位同好,在看到了您的博客之后,跟我发了email. 但是因为您的 博客跟我报告的内容有一点儿出入。如果可以直接在您的博客上说明,可能就会 减少不必要的信息误差。 随信附上两个视频:第一个是在 四天的系统集成与开发挑战所做的是一个自动化物流运送系统。 其视频记录在此: http://toyhouse.cc/video/2012-1 而太阳系的开发视频内容,则是在2010年的International Mathematica Symposium 活动。学生的第一期工作花了至少10天的学习功夫。但是完全是他们自己学习的成果。接下来他们又花了一个月的时间去优化他们的产品。 太阳系模型的视频在此: http://toyhouse.cc/video/building-a-model-solar-system-with-kids?xg_source=activity 谢谢 顾学雍
个人分类: 总结|6124 次阅读|3 个评论
Mathematica中的With,Module及Block的用法及区别
热度 1 zxysx 2012-8-2 16:06
一、 With 函数的用法 With specifies that in expr occurrences of the symbols x, y, ... should be replaced by x0,y0,... . 关于 With 函数,有两点必需注意 : 1 、在 With 函数中出现的局部变量必需赋初值, With 是不合法的。 2 、在 With 函数中出现的局部变量不可在 expr 中再被赋值。 例 1 : In := With ] With::lvws: Variable x in local variable specification {x} requires a value. Out = With ] 例 2 : In := With Set::setraw: Cannot assign to raw object 5. Out = 4 二、 Module 函数的用法 Module specifies that occurrences of the symbols x, y,... in expr should be treated as local. Module defines initial values for x,... . 关于 Module 函数,有一点必需注意: Module 中的局部变量 {x,y,...} 会相应地被重先定义为 {x$nnn,y$nnn,...} (这里 nnn 代表某一整数,随使用次数变化),同时, expr 中出现的所有 x,y,... 都会相应地被 x$nnn,y$nnn,... 所替代。 例: In := Module ] Module ] Module ] t$115 t$116 t$117 三、 Block 函数的用法 Block specifies that expr is to be evaluated with local values for the symbols x, y,... . Block defines initial local values for x,... . 关于 Block 函数,有一点必需注意: 与 Module 一样同样定义了一组 {x,y,...} 的局部变量,但没有 {x,y,...} 被 {x$nnn,y$nnn,...} 替代这一步。因此局部变量如果没有在 Block 中赋初值,则使用全局变量的值代替。 例: In := i=2; In := Block Out := 2+a In := Module Out := a + i$16 四、三个函数的共同点 三个函数都各自定义了一组局部变量,对局部变量的使用不会导致全局变量的值的变化。 例: In := x = 3; With Module Block x Out = 4 Out = 25 Out = 36 Out = 3 五、三个函数的不同点 1 、在 With 函数中出现的局部变量必需赋初值,且在 With 函数中出现的局部变量不可在 expr 中再被赋值,其它两个函数没此限制。 2 、在 Block 函数中,若定义的局部变量没有被赋初值,则使用全局变量的值,而在 Module 函数中,由于局部变量都被重先定义为新的量变,因此不可能使用全局变量。 如上例所述: In := i=2; In := Block Out := 2+a In := Module Out := a + i$16 3 、在运行 With 时,不管 expr 执不执行, x 、 y 的初值 x0 、 y0 都得首先代入到 expr 中,而 Module 和 Block 是首先执行 expr ,然后再代初值。 例: In := {With ], Module ], Block ]} Out = {Hold , Hold , Hold } 4 、在速度方面, With 的运行速度最快,其次是 Block ,最后是 Module 。 例: In := Do , {10^5}] // Timing Do , {10^5}] // Timing Do , {10^5}] // Timing Out = {0.078, Null} Out = {0.094, Null} Out = {0.25, Null}
个人分类: Mathematica|16101 次阅读|0 个评论
[转载]Mathematica 7.0——隐函数的作图
Irasater 2012-6-5 21:55
word: Mathematica 7.0——隐函数的作图.doc mathematica code: 练习.nb Mathematica 的作图功能十分强大,这里介绍其对隐函数的图形的作法。 首先介绍 ContourPlot 函数,我们先看一个例子: 例 1 : ContourPlot ,{x,-1,1},{y,-1,1}] 在 Mathematica 中的执行结果为: 严格来说 sin(xy) 不是一个隐函数,只是 Mathematica 智能地将其转化为隐函数 sin(xy)=a ,然后对 a 取若干可能的值并绘制图形,看下一个例子: 例 2 : ContourPlot ==0.1,{x,-10,10},{y,-10,10}] 在 Mathematica 中的执行结果为: 该图中的每一条线上的点的坐标值都满足 sin(xy)=0.1 ,就这么简单,仿照以上两个例子可以绘制任意你可以想到的隐函数的图形(当然我不能保证每一个都能清晰的绘制出来),下面再给一个帮助文档上提供的范例: 例 3 : ContourPlot +Cos ==1/2,{x,0,4Pi},{y,0,4Pi}] 在 Mathematica 中的执行结果为: 现在介绍二元隐函数的图形的绘制,函数为 ContourPlot3D ,看例子: 例 4 : ContourPlot3D 在 Mathematica 中的执行结果为: 这是一个椭圆球,类似于例 1 ,我们省略等号,看例子: 例 5 : ContourPlot3D 在 Mathematica 中的执行结果为: Mathematica 智能地将其转化为隐函数 x^2+y^2/2+z^2=a ,并绘制了多个可能的取值的图形。
个人分类: Software|7666 次阅读|0 个评论
[转载]Mathematica 用数学软件Mathematica做微积分
Irasater 2012-5-20 14:09
一个不错的资料。。mathematica。。doc 用数学软件Mathematica做微积分.doc
个人分类: Software|3451 次阅读|0 个评论
Mathematica求积分
nadia1989 2012-3-20 20:16
Mathematica求积分
个人分类: Mathematica|7128 次阅读|0 个评论
Mathematica notebook 默认字体大小
nadia1989 2012-3-20 20:14
Format-Option Inspector-打开的窗口中,第一个下拉框中选上Global Preferences,然后在第二行输入FontSize,然后就可以修改了……
个人分类: Mathematica|15525 次阅读|0 个评论
【新书快讯】《Mathematica及其在金融工程中的应用》
sciencepressnj 2011-12-30 09:24
【新书快讯】《Mathematica及其在金融工程中的应用》
【内容简介】 Mathematica 具有功能强大、应用面广、易学易用等优点,因此在工程、物理、生物、社会学、药学、计算机科学和软件开发等众多重要领域得到了广泛的应用,并已成为许多机构的规范工具。在金融工程领域, Mathematica 扮演着越来越重要的角色。 Mathematica 不仅内置金融数据,提供股票、商品、货币的当前和历史市场数据,而且还提供了金融和经济数据的程序式和交互式访问,并支持对其他数据源的导入。在新版本中,系统还提供了关于资金价值、实际利率、债券、金融衍生品的数百个与定量研究有关的内置算法,提供即时的交互式金融图表,并可显示内置金融指标。本书试图帮助读者学习 Mathematica 的基础知识、了解其各种功能,并熟悉其在金融工程中的基本应用,为以后理解复杂金融建模和运算打下基础。 【读者对象】 本书可作为高等院校经济管理类专业的本科高年级教材和教学参考书,也可作为科研人员、工程技术人员以及软件爱好者学习和应用 Mathematica 的参考书。 【作者简介】 华兴夏 1965 年生,江苏无锡人,副教授。本科毕业于上海财经大学政治经济学专业,研究生毕业于中国社会科学院研究生院货币银行学专业。从事马克思主义思想政治理论课程、西方经济学的教学。研究方向:马克思主义理论,社会主义市场经济理论等。
个人分类: 新书快讯——计算机通信软件类|3639 次阅读|0 个评论
[转载]科技数学计算 Wolfram Mathematica 7.0 for Students 软件下载
zsunnywell 2011-12-21 10:23
科技数学计算 Wolfram Mathematica 7.0 for Students 软件下载 .Wolfram.Mathematica.7.0.for.Students.Win32.rar (452.4MB) .Wolfram.Mathematica.7.0.for.Students.Win32.Keygen.rar (245.1KB) 内容简介 Wolfram Research发布了Mathematica的第7个版本,它如今能做得已经远超过符号计算。Mathematica 7.0最值得关注的功能是引入了并行计算,可以充分发挥多核处理器的计算能力。 其它的新特性包括与Microsoft Word公式编辑器简单的粘贴整合, 数学对象的即时3D模型,可能是有史以来最昂贵的Photoshop克隆——内置图像处理和分析功能等。 Mathematica提供了基因组、化学、气象、天文学、金融、测地学数据的完整支持,令其成为科学研究不可或缺的工具。 在在美国德克萨斯州举行的超级计算大会(SC08)上,Wolfram Research宣布新版通用计算软件Mathematica 7将支持NVIDIA CUDA GPU并行计算技术。 据称,融入CUDA技术的Mathematica 7可以在数学运算、建模、模拟和视觉计算等方面获得10倍甚至100倍的性能提升,而且不需要用户另外学习或者编写C语言代码。 配合NVIDIA同时发布的Tesla个人超级计算机,Mathematica 7可以在桌面上执行复杂的数据计算任务,免除了编写原生C程序或等待公共集群的麻烦,为研究人员节省大量的工作时间。 支持CUDA加速的新版Mathematica 7将在2009年第一季度提供,而刚刚发布的普通版Mathematica 7已经面世,在12个应用领域增加了500多个新功能,包括图像处理、并行高性能计算、矢量场视觉化、布尔数学体系运算、统计模式分析等等。 Mathematica可以说是世界上最强大的通用计算系统,自1988年首次发布以来已经拥有数百万用户,对如何在科技和其它领运用计算机有着深刻的影响,并成为许多机构的标准工具,比如财富50强的所有公司、美国gov15个主要机构、全球最大的50所大学等等。 Mathematica 7支持Windows 2000/XP/Vista、Mac OS X、Linux x86、Solaris、UltraSPARC/x86等平台,建议零售价2495美元(北美)或3120美元(亚洲),还提供1095/1315美元的教育版和140美元的学生版。 Following closely on the dramatic reinvention of Mathematica in 2007, Mathematica 7 continues the momentum of innovation to deliver an array of new capabilities, greatly extending the state of the art in many areas, and bringing a dozen major new application fields into the integrated framework of Mathematica.
个人分类: 应用软件|3877 次阅读|0 个评论
LiveGraphics3D教程
zuozw 2009-12-31 10:41
前段时间学习Mathematica时,发现 公司主页上的三维图形可以任意旋转和拖动 ,挺好玩的。查查发现是用LiveGraphics3D制作的,LiveGraphics3D值得学习一下啊 LiveGraphics3D是 Martin Kraus 开发的基于Java程序,支持用 Mathematica 数学软件语言。LiveGraphics3D可以使Mathematica开发的三维图形直接放在网页上,然后用支持Java的任意浏览器查看:任意旋转、拖动等。 网上有很多精彩的LiveGraphics3D动画,例如: 硅纳米管 , 纳米簇实验室 , Wigner-Seitz原胞 。更多例子可参见: http://www.vis.uni-stuttgart.de/~kraus/LiveGraphics3D/examples.html http://www.vis.uni-stuttgart.de/~kraus/LiveGraphics3D/links.html http://mathworld.wolfram.com/topics/LiveGraphics3DApplets.html 至于教程,台湾的一位老师的教程写得比较通俗易懂,当然你也可以学习 Martin Kraus 写的 教程 。共享一下,大家相互学习。 LiveGraphics3D教程
个人分类: 课程学习|2997 次阅读|1 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-16 15:15

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部