其实早在一个多星期前就想写这篇文章了,当时还想让建文学习学习这篇文章中的思路,不过由于当时忙于备考,也就没写。不过现在写应该也为时不晚吧。
先来看这么一个图像:
你能不能想象的到,这张图像仅仅是一个方程的图像?
事情还要追溯到某节数学课上我习惯性的迷失自我时,突然一个想法崩了出来:能不能用一个方程把一堆分段方程表示出来?其实早在高一的时候我和宝嵩高搏讨论某某函数的时候就想到了这个问题,只不过当时没有深入的去研究。不过现在我倒是对这个问题很感兴趣,因为如果可以的话,似乎可以用一个式子画出各种美妙的图像来。这在某些事情上,可能会带来意想不到的惊喜。
花了四五个数学课研究这个问题,似乎还是没有找到一个相当好的方法。虽然基本算法已经出来,但是还是有各种各样的问题没有解决。
最近心情很复杂,但却在客观上激发了我的灵感。于是,在昨天的这个时候,我终于想到了比较完美的解决方案。
其实上面的那张图是这么一个方程在x属于[-2.5,2.5],y属于[-3.5,1.5]范围内的图像:
((abs(y)/y+1)*0.5 *((x+1)^2+y^2-1+1)-1) *((abs(y)/y+1)*0.5 *((x-1)^2+y^2-1+1)-1) *((1-abs(y)/y)*(0.5)*(1-abs(x)/x)*0.5 *(-1.5*x-y-3-1)+1)*((1-abs(y)/y)*0.5*(abs(x)/x+1)*0.5*(1.5*x-y-3-1)+1)=0
(abs(f)表示取f的绝对值,x^y表示x的y次幂。)
或许你已经眼晕了。不过看完下面的这段话,希望你会感觉好一些。
核心算法:
设f(x)=abs(x-a)/(x-a),你会发现,当x>a时,f(x)=1,x<a时,f(x)=-1;
于是可以发现,如果f’(x)=0.5*(abs(x-a)/(x-a)+1),那么,当x>a时,f’(x)=1,x<a时,f’(x)=0;
类似的,如果f’’(x)=0.5*(1-abs(x-a)/(x-a)),那么,当x>a时,f’’(x)=0,x<a时,f’’(x)=1;
这就是核心算法。
主要算法:
如果f’’’(x)=(abs(x-a)/(x-a)+1)*0.5*g(x),那么那么,当x>a时,f’’’(x)=g(x),x<a时,f’’’(x)=0;
但这不是很完美。因为希望的是,在x属于某区间时,得到函数值,在x不属于某区间时,得到任意非0数。只有这样才能够造出一个类似于F(x,y)=0的方程来。
于是,再做些改进:
如果f’’’(x)=(abs(x-a)/(x-a)+1)*0.5*(g(x)-m)+m,那么,当x>a时,f’’’(x)=g(x),x<a时,f’’’(x)=m,其中m为任意非0数;
这就是主要算法。
推广到等式上:
推广到等式上,只需把f(x)与g(x)变成二元函数就可以了。
对于(abs(x-a)/(x-a)+1)*0.5*(g(x,y)-m)+m=0,那么,当x>a时,满足g(x,y)=0即满足原等式,x<a时,任意x,y都不满足原等式。其中m为任意非0数;
更完美些,加入y的范围之后:
对于F(a,b,g(x,y))=(abs(x-a)/(x-a)+1)*0.5*(abs(y-b)/(y-b)+1)*0.5*(g(x,y)-m)+m=0,那么,当x>a且y>b时,满足g(x,y)=0即满足原等式,其他情况下,任意x,y都不满足原等式。其中m为任意非0数;
这里用到了这么一个东西:
如果f*g=0,那么f=0或g=0.
其实有很多方法实现或的关系,但还是这种方法最简单。虽然说可能会遇到各种各样的问题,比如说零乘以一个近似于正无穷的数或者虚数的问题。
理论上讲,零乘上任何数都等于零。不过计算机却不那么认为。因为计算机用1/0代表正无穷,用0/0代表NaN(Not a Number),虚数也被表示成NaN。这就导致了,正无穷乘以零会等于NaN,与NaN做任何运算都得NaN,包括NaN-NaN=NaN。也就是说,NaN不等于任何数。
这样,那么,如果一串乘式:f1*f2*…*fn=0,其中一个fk在某一区间内取不到实数值,那么在这个区间内,整个乘式便都不会成立。
所以,需要尽量避免定义域或值域不属于R的函数出现在乘式中。
把所有的分段函数联系到一起:
上面只能实现小于一个数或大于一个数时取得不同的函数值,但是怎么实现更强大的功能呢?
可以定义这么一个函数:
F’(Xmin,Xmax,Ymin,Ymax,g(x,y))={(x,y)|x>Xmin & x<Xmax & y>Ymin & y<Ymax & g(x,y)=0}
得到F’很简单:
设M=(abs(x-Xmin)/(x-Xmin)+1)*0.5*(abs(y-Ymin)/(y-Ymin)+1)*0.5*(1-abs(y-Ymax)/(y-Ymax))*0.5*(1-abs(x-Xmax)/(x-Xmax))*0.5*(g(x,y)-m)+m=0
这个等式的解的集合就是F’。
然后,需要把所有的M乘起来:
M1*M2*M3*…*Mn=0
这个等式的解集是所有F’的交集。但是别忘了上面提到的乘式的问题。
这样,就得到了我们想要的效果:把分段函数用一个等式表达出来。仔细观察一下上面的心形图像的式子,其实就是用这种方法堆砌的。
理论上,这种方法可以画出任何美丽的图像。
这个想法的应用:
可能有人会问了,说了半天,除了能使式子变得异常复杂以外,还能有什么用?其实用处多多。
比如说你的暗恋对象过生日,不妨用这种方法将一段你想对她说的文字用图像表示出来,然后把式子发给她。当然前提是她数学比较好。你可以想象她把图像画出来之后的惊讶表情吧。到时候别忘了感谢我~
已知的问题:
对着这种思想的探究目前仍处于beta测试阶段。所以可能会有一些意想不到的问题。比如说:
- 目前只能处理x<a或x>a的情况。对于x=a时,结果会是NaN。于是会出现很多问题,比如说画不出直角来,等等。解决方法:将abs(f(x))/f(x)变成abs(f(x,y))/f(x,y),用一条斜线把两个函数分开,而不是一条垂直于坐标轴的直线。
- 在某些图形计算器上,是用相邻的两个点带入等式两边求差值来决定点是否满足等式的。于是可能会出现相邻两个定义域间出现一条不希望出现的线(因为是两个互不相关的子等式组成了新等式)。解决方法:尽量使相邻的两个子等式相邻的部分,等式两边的差值取得相同的符号。需要时可以用-g(x,y)来表示g(x,y)。
- 先写这些吧。我再探究探究。
- (所说的所有图像已用Microsoft Math 3.0或我自己编写的Math Graphics测试成功)
- 版权所有,不得翻录。
306996305
说:
为什么要 对 解答部分 加密呢?
anran
说:
本来想回复可见的,结果没找到这种插件。。就先用这种方法凑合一下,保留一些悬念。
现在没有注册用户可见了。