suffer 发表于 2006-2-23 15:57

[转帖]mathematica若干使用技巧

mathematica的取实部
<P><BR>问:取一个复数函数的实部时,怎么定义函数其中的某些量是实数呢?<BR>如f=exp(i*a),a是实数,然后求re(f),但是结果总是把a当复数处理的,怎么办呢?</P>
<P>通过一个例子说明问题:<BR>AllTwo = {Exp, Conjugate]};<BR>RealPart = (ComplexExpand]] + ComplexExpand]])/2;<BR>ImaginPart = (ComplexExpand]] - ComplexExpand]])/2/I;<BR>Print["RealPart=", RealPart, ";ImaginPart=", ImaginPart]</P>
<P>Out= RealPart="Cos;ImaginPart=Sin</P>
<P>[问题2]变量替换</P>
<P>如果X是x的函数,且存在如下关系:x=a+b ks,那么dX/dx如何表示成为dX/dks?<BR>In:=<BR>x = a + b ks;<BR>X = fg;<BR>D</P>
<P>Out=b fg'</P>
<P>同理,可把dX/dks表示成为dX/dx的命令行如下。<BR>In:=<BR>Clear<BR>ks = (x - a)/b;<BR>X = fg;<BR>D</P>
<P>Out=fg'[(-a+x)/b]/b</P>
<P>例1:X是ks的函数,且X=ks Z, ks=a+b x;则d2X/dx2+X表示成关于d2Z/dks2, dZ/dks,Z(Z对ks的导数等)的式子。<BR>In:= ks = a + b x;<BR>Z = fg;<BR>X = ks Z;<BR>sh = D + c X<BR>Out=c(a+b x)fg+2b^2 fg'+b^2 (a+b x)fg''<BR>其中求导为对ks的导数。这可通过如下命令验证。<BR>D<BR>b fg’<BR><BR>数字填图问题</P>
<P>(万福永 《现代数学教育》科学出版社)</P>
<P>数字填图问题是数学问题的一种趣味形式。早在19世纪后半期,一些数学家就在报刊中大量使用数字填图游戏和字谜游戏等,目的是使业余爱好者也能通过简单的形式去认识、理解和琢磨深奥的数学问题,这些问题中甚至包括困惑了世间智者350多年、于1994 年才刚刚被证明了的“费马大定理”。100多年来,数字填图问题对数学界所起的作用是不言而喻的。<BR>大家都知道,数学问题一般都经过严格的逻辑证明才得以解决。而逻辑证明是指从一些公理出发,经过逻辑推理来证明问题。但随着20世纪40年代以来计算机的诞生和发展,计算机改变了整个世界,计算机已在各个领域发挥作用,并取得了许多重大进展。于是, 能否用计算机来证明数学问题便成了大家关心的话题。所谓计算机证明是指充分发挥计算机计算速度快和会“推理”的特点,用计算机程序模拟解题或进行穷举检验,最后得到问题的解。<BR>我们将通过生活中几个常见的数字填图问题的探究,谈谈这类问题的逻辑推理解法和计算机解法。<BR>例1:在图1的几个加法等式中,每个□表示一个非零数字,任意两个数字都不相同,问有多少个解?<BR>□+□=□,□+□=□,□+□=□0<BR>图1</P>
<P>计算机解法——为验证此结果,用 Mathematica编程进行模拟解题,充分利用计算机运算速度快的特点进行穷举法检验。实践表明本问题解的情况恰如上所述。我们用Timing[ ]函数对两个程序进行计时,可以看出程序2是程序1的提速版。<BR>程序1:<BR>Timing[          (*a+b=c,d+e=f,f+h=i0*)<BR>Clear;n=0;<BR>For<BR>]]]]]]]]]]]]]]]]](*total have 17 right ")"s *)<BR>]<BR>程序2:<BR>Timing[<BR>Clear;n=0;<BR>For[a=1,a&lt;=9,a++,<BR>For[b=a+1,b&lt;=9,b++,<BR>For[c=b+1,c&lt;=9,c++,<BR>For[d=a+1,d&lt;=9,d++,If[d!=b&amp;&amp;d!=c,<BR>For[e=d+1,e&lt;=9,e++,If[e!=b&amp;&amp;e!=c,<BR>For[f=e+1,f&lt;=9,f++,If[f!=c,<BR>For[g=1,g&lt;=9,g++,If[g!=a&amp;&amp;g!=b&amp;&amp;g!=c&amp;&amp;g!=d&amp;&amp;g!=e&amp;&amp;g!=f,<BR>For[h=g+1,h&lt;=9,h++,If[h!=a&amp;&amp;h!=b&amp;&amp;h!=c&amp;&amp;h!=d&amp;&amp;h!=e&amp;&amp;h!=f,<BR>For[i=1,i&lt;=9,i++,If[i!=a&amp;&amp;i!=b&amp;&amp;i!=c&amp;&amp;i!=d&amp;&amp;i!=e&amp;&amp;i!=f&amp;&amp;i!=g&amp;&amp;i!=h<BR>&amp;&amp;a+b==c&amp;&amp;d+e==f&amp;&amp;g+h==10*i,</P>
<P><BR>   Print[ ++n,": ",a,"+",b,"=",c,",",d,"+",e,"=",f,",",g,"+",h,"=",i,"0"]<BR>]]]]]]]]]]]]]]](*total have 15 right ")"s*)<BR>]</P>
<P><BR>函数说明:<BR>1. For[...]:循环函数;<BR>2. While[...]:循环函数;<BR>For循环函数和While循环函数适用于生成非结构循环,While循环函数只有当条件满足时才执行循环体,而For循环函数则按一定步长递增执行循环体。循环功能基本上和C语言的一样。格式:For 和 While。<BR>例如:Clear<BR>For]n=20; <BR>While[(n=Floor)!=0, Print] <BR>3. If[...]:Mathematica提供的设置单个条件的函数,一般用If函数控制分支。<BR>格式: If,条件满足时取t,条件不满足时取f,否则取u。<BR>例如: If <BR>下面,我们来动手练习两题:<BR>练习1(一道竞赛题):<BR>1998年4月香港数理教育学会主办的初中数学竞赛有这样一道试题:在下面的加法算式中,每个□表示一个数字,任意两个数字都不相同,那么A与B的乘积的最大值是多少?<BR>□+□□+□□□=□□AB</P>
<P>解答:最大值是15。你能给出逻辑推理解法并用计算机加以验证吗?<BR>练习2(真分数问题):</P>
<P>□/□□+□/□□=□/□□<BR>这是由一位日本数学家在一次数学家大会上提出的一个问题:图3中的加法等式是:两个真分数之和等于第三个真分数(不要求为既约分数),每个□表示一个非零的数字,任意两个数字都不相同。比如:1/32+5/96=7/84 ,试找出所有可能的解。<BR>本问题利用计算机程序已找到解答,共有 10 个解,但想给出相应的逻辑解法相当困难,可以说计算机模拟解题能力在某些方面确已达到并超过了逻辑推理解题的能力。<BR><BR>转自科研中国</P>

aiweng 发表于 2012-3-6 10:28

这个问题有点复杂,一起关注,期待高手!
页: [1]
查看完整版本: [转帖]mathematica若干使用技巧