xzcyr xzcyr
关注数: 3 粉丝数: 748 发帖数: 13,947 关注贴吧数: 17
不到2M的Tiny C Compler(TCC)原来也可以用作Compile的编译器啊 不知编译为何的同学先看这里: note.youdao.com/share/?id=bf2a031f7d0d69064941032c7857dfd1&type=note#/ 这是我前两天灵光一闪意识到的:既然配置GCC的时候,用的是GenericCCompiler选项——这选项里有个Generic啊,那说不定,其他的编译器也能用这个方法配置?于是仔细读了读帮助又试了试,发现还真是这样。总之这里给出配置方法。 TCC的配置方法与GCC几乎是一样的,这里依旧以64位Windows为例。 首先把TCC下载下来。官网地址:download.savannah.gnu.org/releases/tinycc/ (目前Win64位下的最新版是tcc-0.9.27-win64-bin.zip。) 然后,解压到任意路径。(我这里为了便于说明,就放在C盘根目录了。不排除在某些特殊路径下会出现BUG。) 最后,我们在Mathematica里执行 SystemOpen@"init.m" 打开配置文件,再在其中写入 << CCompilerDriver`GenericCCompiler` $CCompiler = {"Compiler" -> GenericCCompiler,"CompilerInstallation" -> "C:\\tcc","CompilerName" -> "tcc.exe"}; 并保存。(再次强调,注意安装路径"CompilerInstallation"需要改成你的安装路径,并且这个路径不能有空格。此外,这次我没有设"SystemCompileOptions"选项,因为TCC似乎没有优化相关的选项可设。) 然后就可以愉快地编译了。 ……不过,实践之后发现,TCC的性能相较于GCC似乎并不好,应该是为了编译快而放弃了优化。不过总的来说还是挺好玩的,大家可以玩一玩。 顺便,有谁装了微软家的编译器的话,可以试试上面的方法行不行。
【交流】这个二维N-S方程边值问题在其他软件里是怎么解的? 标题又写不下了……其实原本我拟的标题是 【交(gǎo)流(shì)】这个经典(大概)的纳维斯托克斯方程的边值问题(二维稳态不可压缩流)在其他软件里是怎么解的? 大家都知道,NDSolve自版本10开始加入了有限元方法("FiniteElement"),终于可以求解 1. 不含时的偏微分方程定解问题(或者说得更“数学”一点:不管在哪个方向上都不是 适定的初值问题的偏微分方程定解问题) 2. 不规则区域上的的偏微分方程定解问题 了,尽管目前NDSolve的有限元方法展现出了一些吸引人的特性(比如简洁易懂的语法),但是,它还很年轻, 截止版本11.2,它还不能求解非线性问题。比如这一帖 mathematica.stackexchange.com/a/96579/1871 里面提及的问题。如大家所见,user21 使用了一些较低级的有限元函数来求解这个问题,老实说,我一个用了几年Mathematica的人,看了他的代码都觉得脑仁疼……显然,在当前,如果需要在不规则区域上求解非线性的偏微分方程,Mathematica恐怕不是一个很好的选择。 那什么才称得上是“很好的选择”呢? 开这个帖就是想让各位来秀一下。(我知道吧里存在复数个其他有限元软件的用户。) 事先声明下规则:所有讨论围绕上面所举的例子进行,谢绝空谈,违者……可能删。(毕竟这是个涉及软件对比的帖子,我得最大限度地压制住出现无谓争端的可能性。) 为了方便大家阅读,这里重述一下上面帖子中出现的问题。首先是方程组:参数: \[Mu] = 10^-3; \[Rho] = 1; 区域(就直接上代码了,应该都能看懂吧……): l = 2.2; h = 0.41; \[CapitalOmega] = RegionDifference[Rectangle[{0, 0}, {l, h}], ImplicitRegion[(x - 1/5)^2 + (y - 1/5)^2 < (1/20)^2, {x, y}]]; RegionPlot[\[CapitalOmega], AspectRatio -> Automatic]边界条件 \[CapitalGamma] = { DirichletCondition[p[x, y] == 0., x == l], DirichletCondition[{u[x, y] == 4*0.3*y*(h - y)/h^2, v[x, y] == 0}, x == 0], DirichletCondition[{u[x, y] == 0., v[x, y] == 0.}, y == 0 || y == h || (x - 1/5)^2 + (y - 1/5)^2 <= (1/20)^2]}; ……其实就是左边界速度分布为4*0.3*y*(h - y)/h^2,压力的右边界为0。 好了,大家来展示下自己所用的软件是怎么解这个问题的吧。
3分钟复现系数为正负1的全体n次幂方程的根的复平面图形 原本是想直接续在这帖:http://tieba.baidu.com/p/2134509239的后面直接回复的,但是考虑到那帖楼层数已经较多,默默发在那边无法满足我的虚荣心(殴)所以决定重开一帖。(其实@隨意超 似乎已经在那帖11楼找对了方向,但却似乎没有引起后续的参与者的重视。) 先上代码和图再讲解吧。2GB内存2GHz老爷机,3 min出图: modifiedroots[c_List] := Block[{a = DiagonalMatrix[ConstantArray[1., Length@c - 1], -1]}, a[[1]] = -c; Eigenvalues[a]]; s = 1000; l = ConstantArray[0., {s + 1, s + 1}]; l[[#, #2]] += 1. & @@@ Round[1 + s Rescale@ Function[z, {Im@z, Re@z}, Listable]@ Flatten[modifiedroots /@ Tuples[{-1., 1.}, 18]]]; // AbsoluteTiming ArrayPlot[UnitStep[80 - l] l, ColorFunction -> "AvocadoColors"]当然,我说“复现”其实是标题党了,因为原图算到了24次多项式,我这幅图只算到了19次。(这是2G内存的极限,次数每加1,内存占用大约要翻一番。)但是如大家所见,这幅图的效果已经和那幅Sam Derbyshire画了3天3夜的图相差无几了。 下面简单讲解一下这段代码。要做到在多数人可以 接受的时间内使用多数人 可以接受的内存获得 和那幅图相似的效果,需要: 1 省略对这个特别的问题而言其实不必要的(主要是符号)计算。 2 昨晚对像素点十分有限的屏幕而言其实不必要的仅有着细微差别的数据。 3 正确地注意到原图的颜色代表的是什么。 先说第一点。因为这幅图表示的是幂方程的根,所以我们自然需要求解幂方程。如何解方程?我们的第一反应是Solve。是的,Solve可以求解这个问题,但是,作为一个通用求解器,它对这个问题而言太慢了。有没有更为专用的函数可以求解这个问题?在本文开头的帖子里@草红样 找到了NRoots,一个专解多项式方程的函数,从而大大提速了求解。可是,这是否是终点?不,NRoots依旧需要进行多项式结构的分析,我们能不能把这一部也给省掉,直接使用(以确定次序排列的)多项式系数表作为输入来求根?再一次,答案是肯定的,那就是我们上面使用的modifiedroots。(对于NRoots的提速问题的讨论其实尚未结束,有兴趣的参考这帖:http://tieba.baidu.com/p/3575212088) 另,不难注意到“全体系数为正负1的全体n次幂方程”其实有一半是重复的。上面的modifiedroots已经利用了这个特性。 再说后两点。(这两点其实是相联系的,所以一起讲。)对方程的求解将会产生大量的数据,这倒是其次,真正够呛的是如何将这些数据绘成图形。(具体参看本文开头帖子中大伙儿的哀嚎。)正常情况下,要画这么多的点很花时间,还吃内存,更麻烦的是,还怎么画也不像Sam Derbyshire那幅“震撼”的图!要跨过这个槛,需要另一个技巧,好吧,其实这个技巧我是从这帖学来的:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmathematica.stackexchange.com%2Fquestions%2F50839%2Fsmooth-peter-de-jong-attractor%23comment149926_50839&urlrefer=826a9b85381fccc015cc5edd4575e535 (注意下面的答案最好也看看),这里的重点是,Sam那幅图中的颜色明暗到底表现的是什么?复平面上同一点处重合的点量?我们不难想像完全重合的点其实是很少的,是的, 颜色的明暗其实表现的只是某一个点附近小区域内的点量。如何决定这个小区域?对于这点,我们的计算机屏幕其实已经帮我们限制好了: 屏幕上的像素点是很有限的。于是这又反过来启发了我们:既然最终在屏幕上呈现的点数有限,我们又何必把所有的点都拿去画图?只要事先统计好每个像素内有多少点,再把这个统计结果拿去画图就好了嘛。哪个函数可以经济地画出这种原始数据点数极多的明暗图?我们有ArrayPlot。ArrayPlot可以调配色方案嗯。 另,最后画图时使用UnitStep剪掉了实轴上的点,因为影响视觉效果。 感觉其实还有些地方地方可以解说下不过现在也累了所以算了。 最后,其实即便抛开方程阶数,单论配色方案,我也没有完全“复现”人家的图。(小声:不过我自以为我选的方案更好看。)有谁有兴趣可以研究下怎么用Blend把原图的颜色混合出来。(应该不是某个Mathematica里现成的配色方案吧……)
首页 1 2 3 下一页