智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 36364|回复: 174
打印 上一主题 下一主题

[分享] 灰原姐姐教你成为上帝

  [复制链接]

36

主题

1837

帖子

3

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6375
威望
3368
贡献
1847
兑换币
2326
注册时间
2013-2-3
在线时间
580 小时
跳转到指定楼层
1#
发表于 2013-3-18 21:51:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
灰原姐姐是标题党,如果你因为这个标题被骗进来,那我向你道歉。
我们是信奉共产主义的无神论新时代好青年,怎么能搞封建迷信呢?

好了,先说说我们到底想讲什么吧。
姐我昨晚(不是发帖时间的昨晚)入睡前被 @tju_speed同学(用QQ吵醒了,问我SCS是怎么做出来的。
姐我这般如此如此这般地解释一个多小时,tju_speed同学终于略有感悟。
姐想啊,tju_speed是爱学习的好同学啊,而论坛上不乏像tju_speed这样爱学习的好同学啊。
怎么能独乐乐而不众乐乐呢?
于是姐让tju_speed同学将我们的聊天记录整理出来,于是有了诸位看到的东西《灰原姐姐教你成为上帝》。
好了闲言碎语不要讲,然我们正是开始吧。

(灰原姐姐最讨厌某些大牛写的大部头啦!
一本书分5个部分,每个部分十几章,每章十几节,每节十几点……,
让不让人囤脑细胞啦!
所以姐姐我拒绝分章分节,
以下所有文字只有一章,每章只有一节,每节只有一点……)

先来看看tju_speed同学问的一些问题:
“如何创建一个仿真环境?”
“如何创建一个物体”
“如何给这个物体施加一个力?”
有没有觉得面对这些问题很无力?
编过程序的同学应该知道如何创建一个变量、一个函数
但是“仿真环境”、“物体”是什么玩意儿?
(知道OOP的同学请悄悄绕行)

36

主题

1837

帖子

3

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6375
威望
3368
贡献
1847
兑换币
2326
注册时间
2013-2-3
在线时间
580 小时
2#
 楼主| 发表于 2013-3-18 21:54:01 | 只看该作者
本帖最后由 灰原姐姐 于 2013-3-18 22:20 编辑

既然如此,举个栗子。
世界一:已知一质点在无穷大光滑平面上的初始位置和速度,求时间t后其位置。
(嘿嘿,各位看官见笑,这么简单的问题都拿来举栗子。)
算法:
        读入初始位置P
        读入初始速度V
        读入时间t
        输出P+V*t
        搞定
C语言代码:
int main (){
        double Px,Py;               // position
        double Vx,Vy;               // velocity
        double t;                      // time

        scanf ("%lf%lf",&Px,&Py);                // read position
        scanf ("%lf%lf",&Vx,&Vy);                // read velocity
        scanf ("%lf",&t);                             // read time
        printf("%lf %lf",Px+Vx*t,Py+Vy*t);    // output last position

        return 0;        // end
}
是不是很简单?你也会写!有木有?灰原姐姐在此恭喜你,你已经成为上帝啦!
莫慌,怎么就成为上帝了呢?成为上帝这么容易?
说到这个问题,我们先来探讨一下什么是世界!

回复 支持 反对

使用道具 举报

36

主题

1837

帖子

3

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6375
威望
3368
贡献
1847
兑换币
2326
注册时间
2013-2-3
在线时间
580 小时
3#
 楼主| 发表于 2013-3-18 21:55:35 | 只看该作者
其一:什么是世界?(What is world?)
答:世界就是你我此刻所讨论的。(World is what we are talking about.)
(坑爹啊!)

其二:世界是物质的
问:什么是物质?
答:物质就是世界的组成成分
(继续坑爹啊!)

道家言,道可道非常道,姑且先承认上面说的吧。

其三:物质是运动的
问:什么是运动?
答:运动是物质的存在状态对时间的函数
问:什么是时间
答:世界的其中一个维度
问:什么是维度
答:呃……
问:问你话呢
答:呃……
问:怎么不说话了?诶!你别动手啊!啊!救命……
(卒)

其四:运动是有规律的
问:我不是已经死了吗?
答:是的。
(卖萌可耻)

灰原姐姐试图不自量力地回答“什么是世界”这样深奥的问题,殊不知我们的世界的上帝正在为我准备地域……
还是回到我们的小小的“世界一”上来吧。

我们可以将“世界一”看成这样一个系统,该系统接收若干输入,给出若干输出。
现实系统的输入和输出分别有三种形式:物质、能量、信息,
例如人要吃饭、散热、看书。
(本质上能量也是物质的存在形式,而信息必须由物质或能量作为载体
故三者可统一成物质,在此区分仅为了讨论方便)
而“世界一”是只有信息作为输入输出的系统。

“世界一”是由物质组成的,具体而言包含两个物体:无穷大光滑平面、质点。
其中,无穷大光滑平面没有“状态”,故其不随时间变化,也就是说,他不“运动”。
而质点有“位置”这个“状态”,位置随时间变化,所以质点是运动的。
既然平面没有运动,而物质本质上是运动的载体,那么我们无需研究平面,将其忽略,集中精力研究质点。

质点有位置这个状态,“世界一”接收初始位置,输出时间t后的位置。
而且末位置由初始位置、速度、时间t唯一确定。“世界一”是个确定系统。
那么“世界一”是如何将输入对应到输出的呢?
就是这个公式:Pt==P0+V*t (末位置等于初位置加上初速度与时间的乘积)
等等,凭什么是这个公式?我能不能用Pt==P0-V*t?或者直接Pt==P0
当然可以,这都不重要,我们用这个公式仅仅是因为灰原姐姐所处的世界正好也有这个规律,伽利略发现的。
总之,输入到输出是有一个关系的,这就是物质运动的规律啊!

至此:(呼应前文)
其一:我们正在讨论“世界一”
其二:“世界一”是由物质构成的(就是我们讨论了半天的质点)。
其三:物质是运动的(质点的状态“位置”会随时间的变化而变化)。
其四:运动是有规律的(即公式Pt==P0+V*t

看!“世界一”就是一个活生生的世界啊!!!它活生生地运行在灰原姐姐的电脑中啊!!!
怎么样,有没有当上帝的感觉啦?

不管你如何认为,反正灰原姐姐觉得,写出并成功运行上面的代码,你就是上帝,你就成功地创建了一个世界。
但是这个“世界一”貌似也太简单了,简单的输入,简单的输出,上述两者简单的对应关系。
于是灰原姐姐决定创建一个更复杂的世界。

回复 支持 反对

使用道具 举报

41

主题

525

帖子

0

精华

常驻嘉宾

镜花水月

Rank: 8Rank: 8

积分
4910

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

QQ
威望
2394
贡献
1464
兑换币
1115
注册时间
2012-10-23
在线时间
526 小时
4#
发表于 2013-3-18 21:56:11 | 只看该作者
虽然不懂,还是顶一下吧。
回复 支持 反对

使用道具 举报

36

主题

1837

帖子

3

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6375
威望
3368
贡献
1847
兑换币
2326
注册时间
2013-2-3
在线时间
580 小时
5#
 楼主| 发表于 2013-3-18 21:57:25 | 只看该作者
本帖最后由 灰原姐姐 于 2013-3-18 22:21 编辑

世界二:刚体在无穷大光滑平面上做平面平行运动(看不懂的同学悄悄百科去吧),已知其初始位置、速度、角度、角速度,求时间t后其位置、角度。
算法:
        读入初始位置P
        读入初始速度V
        读入初始角度A
        读入初始角速度W(本来应该是“欧米伽”,但是灰原姐姐懒得打希腊字母)
        读入时间t
        输出P+V*t
        输出A+W*t
        搞定
C语言代码:
int main ()
{
        double Px,Py;        // position
        double Vx,Vy;        // velocity
        double A;              // angle
        double W;             // omiga
        double t;               // time

        scanf ("%lf%lf",&Px,&Py);        // read position
        scanf ("%lf%lf",&Vx,&Vy);       // read veocity
        scanf(“%lf”,&A);        // read angle
        scanf(“%lf”,&W);       // read omiga
        scanf ("%lf",&t);        // read time

        printf("%lf %lf",Px+Vx*t,Py+Vy*t);    // output last position
        printf(“%lf”,A+W*t);                       // output last angle

        return 0;        // end
}

相信能理解“世界一”的同学很快就能理解“世界二”了!
两者在代码上几乎是一样的,只是加了初始角度,以及公式At = A0+W*t (角动量定理)而已。
“世界一”只能描述质点,而“世界二”已经能描述刚体的平面平行运动了。
稍微了解一点物理的同学肯定知道,平面平行运动的刚体的自由度是3,所以“世界二”的输出也是三个数。

至此:(呼应前文)
其一:我们正在讨论“世界二”
其二:“世界二”是由物质(就是我们说的那个刚体)构成的。
其三:物质是运动的(刚体的状态“位置”、“角度”会随时间的变化而变化)。
其四:运动是有规律的(即公式Pt==P0+V*tAt = A0+W*t

看!“世界二”也是一个活生生的世界啊!!!它活生生地运行在灰原姐姐的电脑中啊!!!

乘热打铁,“世界一”及“世界二”都是简单映射的系统,
灰原姐姐赶紧基于“世界一”举出第三个栗子,更复杂的例子。
同学们做好心理准备。

回复 支持 反对

使用道具 举报

36

主题

1837

帖子

3

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6375
威望
3368
贡献
1847
兑换币
2326
注册时间
2013-2-3
在线时间
580 小时
6#
 楼主| 发表于 2013-3-18 21:59:00 | 只看该作者
本帖最后由 灰原姐姐 于 2013-3-18 22:22 编辑

世界三:已知一质点在无穷大光滑平面上的初始位置和速度,求任意时间后其位置。(注意哦!是任意时间哦!不是确定的时间t哦!)
(在此假设“任意时间”流逝速度与灰原姐姐所处的世界流速相同,step是一个较短的时间,例如1毫秒)
算法:
        读入初始位置P
        读入初始速度V
        置初始时间为0
        循环
                等待时间step
                读取当前时间t
                输出P+V*t
        搞定(这个“搞定”永远也不会执行)
C语言代码:
int main ()
{
        double Px,Py;                // position
        double Vx,Vy;                // velocity
        double t = 0.0;               // time
        double step = 1000;        // step time

        scanf ("%lf%lf",&Px,&Py);        // read position
        scanf ("%lf%lf",&Vx,&Vy);        // read velocity

        while (1) {
                sleep (step);        // call os api
                readtime (t);        // call os api
                printf("%lf %lf",Px+Vx*t,Py+Vy*t);        // output last position
        }

        return 0;        // end
}
先解释一下,sleep 以及 readtime 调用了操作系统API,分别表示睡眠一段时间、读取程序运行时间。
这两个函数都是灰原姐姐随便写的,因为不同的操作系统API不一样。
所以具体这两句怎么写是不一定的。(当然调用这两个函数之前要include相应的头文件)(这已经不是C语言的范畴了)
上面这个程序严格来讲已经不是“算法”了,因为它永远不会停机。
他会每隔一段时间(step变量所表示的时间)输出一个坐标,表示质点当前的位置。
很明显,它是一个世界,而且比“世界一”、“世界二”更像我们的世界,如果你不信,我们可以这样诠释它:
int main ()
{
// 以下6行是大爆炸
        double Px,Py;                // position
        double Vx,Vy;                // velocity
        double t = 0.0;               // time
        double step = 1000;        // step time

        scanf ("%lf%lf",&Px,&Py);        // read position
        scanf ("%lf%lf",&Vx,&Vy);        // read velocity

// 以下5行是大爆炸之后的事情
        while (1) {
                sleep (step);        // call os api
                readtime (t);        // call os api
                printf("%lf %lf",Px+Vx*t,Py+Vy*t);        // output last position
        }

// 以下1行是大坍缩
        return 0;        // end
}
有没有,有没有!是不是跟我们的世界一模一样?
只不过“世界三”明显是开放宇宙,而我们的世界是开放的还是封闭的,我们还不知道,也等不到了。
“世界一”与“世界二”虽然有时间的概念,但本质上它们还是静态的,输入与输出简单对应。
但是“世界三”就是个动态的世界了,它会实时输出质点当前的位置。
而且,由readtime(t)函数保证,“世界三”的时间流逝速度和我们“真实”世界时间流逝速度是一致的。
如果在readtime(t)后面加一句t = t*2;那么“世界三”的速度就比我们“真实”世界快!
我们只要缩放时间变量t的值,就可以改变虚拟世界的时间流逝。

至此,我们完成了静态宇宙到动态宇宙的仿真过程。

总结世界一二三,他们有个共同的特点:
当初始条件确定时,输出就已经确定了,观察者只需要盯着屏幕看输出就可以了。
但是现实世界哪有这么简单。再举个栗子,以世界三为基础,稍微复杂一点。

回复 支持 反对

使用道具 举报

36

主题

1837

帖子

3

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6375
威望
3368
贡献
1847
兑换币
2326
注册时间
2013-2-3
在线时间
580 小时
7#
 楼主| 发表于 2013-3-18 22:00:12 | 只看该作者
本帖最后由 灰原姐姐 于 2013-3-18 22:26 编辑

世界四:已知一质点在无穷大光滑平面上的初始位置和速度,以及任意时间的受力情况,求任意时间后其位置。
(注意哦!还有一个受力情况哦!)
算法:
        读入初始位置P
        读入初始速度V
        读入质量m
        置初始时间为0
        循环
                等待时间step
                读取当前时间t
                读取当前受力F
                V += F/m*step;
                输出P+V*t
        搞定
C语言代码:
int main ()
{
        double Px,Py;                // position
        double Vx,Vy;                // velocity
        double Fx,Fy;                // force
        double t = 0.0;              // time
        double step = 1000;       // step time
        double m;                     // mass

        scanf ("%lf%lf",&Px,&Py);        // read position
        scanf ("%lf%lf",&Vx,&Vy);        // read velocity
        scanf(“%lf”,&m);                     // read mass

        while (1) {
                sleep (step);        // call os api
                readtime (t);        // call os api
                scanf(“%lf%lf”,&Fx,&Fy);        // read force
                Vx += Fx/m*step;
                Vy += Fy/m*step;
                printf("%lf %lf",Px+Vx*t,Py+Vy*t);        // output last position
        }
        return 0;        // end
}
稍具物理知识的同学应该都看得懂吧,“世界四”每次循环都会读入一个受力,并且据此改变质点的速度。
“世界四”与之前的世界有本质的区别。“世界四”在“运动”过程中是一直接受一个输入的。
“世界四”是在一个参数的作用下变化的。即使初始状态一样,最终世界的发展过程也可能不一样。

以这个栗子反观我们存在的世界,大爆炸瞬间,我们的宇宙的运动过程是否由机械决定论确定?
在宇宙发展过程中,是否接受额外的输入来调节未来的发展方向?
如果有额外的输入,那这个输入是如何确定的?上帝在投掷色子吗?
量子效应是否就是上帝投掷的色子?
……

算了,不想了,上帝又在给灰原姐姐准备地域了。

回复 支持 反对

使用道具 举报

36

主题

1837

帖子

3

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6375
威望
3368
贡献
1847
兑换币
2326
注册时间
2013-2-3
在线时间
580 小时
8#
 楼主| 发表于 2013-3-18 22:01:40 | 只看该作者
栗子就举这么多了,吃多了不消化也不好,总结一下吧。

我们的宇宙是由物质组成的,物质是运动的。
为了描述这样的宇宙,人类发明了数学。
数学,以“数”作为描述“物质”的概念,以“运算”作为描述“运动”的概念。
在线性代数中,“线性变换”这个运算本身可以由“矩阵”这个结构表示,揭示了运动的本质还是物质。
为了使人更方便地计算,人类发明了计算机。
计算机,以“数据”、“变量”作为描述物质的概念,以“指令”作为描述“运动”的概念。
指令本身保存在存储器中,又可以看成数据,同样揭示了运动的本质还是物质。

据此,为了用计算机软件描述我们所处的世界,我们用变量来描述物体的状态,例如位置、速度、角速度等。
我们用公式(实际上被编译器转变为一系列指令)来描述物质的运动规律。
对物体反复应用这些公式,即得得到宇宙运动发展的过程。
将发展过程的状态输出,即可观察到宇宙运动的整个过程。
当然,上述栗子都是简单地输出数据来表达过程的。
如果用图形库(例如opengldirectX)将数据绘制成图像显示在屏幕上,就得到更直观的结果。

到这一步,灰原姐姐终于可以明确的告诉各位同学偶不是标题党了。
计算机仿真虚拟现实,本质上是个上帝工程,是创造一个世界的过程。
这个虚拟的世界,以真实世界为蓝本。用变量,表示“真实”世界的物体的状态;用公式,表示“真实”世界的物理规律。
以此作为真实世界的一个“模型”。
通过研究模型的规律,来反映真实世界的规律。
由于模型具有一些真实世界没有的优点(例如:可调节仿真速度,几乎不耗电,没有电路故障的干扰),
故基于模型研究真实世界可以达到提高生产力的目的。
当然,由于计算机是离散的,而物理世界姑且可以看成是连续的,所以一定有误差存在。
仿真时应尽量减小误差,将算法移植真实世界时也要正视这之间的差距。

如果各位同学想开发自己的仿真软件,仅仅知道这些原理是不够的。
你还需要面对各种细节问题,开发工具的使用问题。
但不要怕,这些前进道路上的畔脚石同样是垫脚石。
正视他们,不怕钻研,解决他们,你会越走越高,越走越远。

回复 支持 反对

使用道具 举报

137

主题

2197

帖子

1

精华

知名人物

广州穗佳电子科技有限公司飞思卡尔专业店

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
23283

特殊贡献奖章资源大师奖章优秀版主奖章热心会员奖章论坛元老奖章活跃会员奖章优秀会员奖章在线王奖章论坛骨干奖章

QQ
威望
6807
贡献
12964
兑换币
9459
注册时间
2011-6-24
在线时间
1756 小时
9#
发表于 2013-3-18 22:02:37 | 只看该作者
哈哈~这个写得生动,是我喜欢的风格~~
回复 支持 反对

使用道具 举报

1

主题

2067

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5124

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
2752
贡献
898
兑换币
59
注册时间
2012-12-8
在线时间
737 小时
10#
发表于 2013-3-18 22:04:33 | 只看该作者
把我绕晕了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-25 02:19 , Processed in 0.056129 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表