如何評價最強大腦選手余彬晶及其表現?


搬運自如何評價《最強大腦》第四季中,余彬晶所進行的分形之美(從分形圖推演x y取值)這一挑戰的難度?

改了下代碼,換了清晰的圖片。這回結論清楚多了。

===============================================

廢話不多說,上代碼。

"""
@author: Zeqian Li
"""

import numpy as np
from math import sqrt

def julia(c, focus=(0, 0), zoom=1, resolution=640, maxstep=20):
"""Return a numpy grid of juliaset set.
Args: c: constant c in x^2+c
Kwargs: focus: display region center
zoom: zoom scale compared to the default scale (r=(-1,1),i=(-1,1))
resolution: resolution of displayed image
maxstep: maximum calculation step

"""
_xlen = 2
_xyratio = 1
_ylen = _xlen / _xyratio
xreso,yreso=resolution,int(resolution/_xyratio)

grid = np.zeros((yreso,xreso))
c_real, c_imag = c
xmin, xmax = (focus[0] - _xlen / zoom / 2, focus[1] + _xlen / zoom / 2)
ymin, ymax = (focus[0] - _ylen / zoom / 2, focus[1] + _ylen / zoom / 2)
R = (1 + sqrt(1 + 4 * sqrt(c_real ** 2 + c_imag ** 2))) / 2
RSqr = R ** 2

def in_julia(real, imag, step=0):
if step &>= maxstep:
return step
fx_real = real ** 2 - imag ** 2 + c_real
fx_imag = 2 * real * imag + c_imag
# print(fx_real,fx_imag)
if fx_real ** 2 + fx_imag ** 2 &> RSqr:
return step
else:
return in_julia(fx_real, fx_imag, step + 1)

def pix_in_julia(pixx, pixy):
return in_julia(xmin + pixx / xreso * (xmax - xmin),
ymax - pixy / yreso * (ymax - ymin))

for x in range(xreso):
for y in range(yreso):
grid[y, x] = pix_in_julia(x, y)
return grid

1. 首先,遍歷實部虛部(-2,2)範圍內,0.1為步長的400個c值圖案:(迭代次數:5

畫這麼大我就是想把這Mandelbrot Set畫出來。一個有名結論是Julia Set圖案這樣堆到一起就會變成Mandelbrot Set。這個因為Mandelbrot Set就是所有在(0,0)下x^2+c收斂的c值的集合,所以所有的Julia Set的中心堆到一起就變成了Mandelbrot Set.

可以參考下節目的幾個參數範圍在哪裡。

代碼:

rmin,rmax=-2,2
imin,imax=-2,2
step=0.1
rpointnum,ipointnum=int((rmax-rmin)/step)+1,int((imax-imin)/step)+1
maxstep,resolution,zoom=(5,100,0.7)

grids=np.zeros((ipointnum*resolution,rpointnum*resolution))

progress=1
for i,real in enumerate(np.linspace(rmin,rmax,rpointnum)):
for j,imag in enumerate(np.linspace(imax,imin,ipointnum)):
grids[j*resolution:(j+1)*resolution,i*resolution:(i+1)*resolution]=julia((real,imag),resolution=resolution,zoom=zoom,maxstep=maxstep)
print("Progress: "+str(progress)+"/"+str(rpointnum*ipointnum))
progress += 1

plt.imshow(grids)
plt.imsave("iterate_c.png",grids)
xticks=np.linspace(int(resolution/2),int(grids.shape[1]-resolution/2),rpointnum)
xlabels=["{0:.2f}".format(i) for i in np.linspace(rmin,rmax,rpointnum)]
plt.xticks(xticks,xlabels)
yticks=np.linspace(int(grids.shape[0]-resolution/2),int(resolution/2),ipointnum)
ylabels=["{0:.2f}".format(i) for i in np.linspace(imin,imax,ipointnum)]
plt.yticks(yticks,ylabels)
plt.xlabel("Real")
plt.ylabel("Imaginary")
plt.show()

2. 視頻里比較厲害的一點是精確到了小數點後三位,於是再畫一下這個精度下圖案的敏感度。中間的是正確結果,步長0.002,參賽者三次猜的結果都在0.003範圍內。(迭代次數:40

代碼:

paras = {"YlOrBr": (0.503, 0.181),
"BuPu": (0.430, 0.016),
"Greens": (-1.162, 0.204)}

step = 0.002
rnum, inum = 2, 2
maxstep, resolution, zoom = (40, 600, 0.7)

# grids = [np.zeros(resolution * (2 * inum + 1), resolution * (2 * rnum + 1)) for key in paras]

for num,(cm, c) in enumerate(paras.items()):
progress = 1
grid = np.zeros((resolution * (2 * inum + 1), resolution * (2 * rnum + 1)))
for j,re in enumerate(np.linspace(-rnum, rnum ,rnum*2+1)):
for i,im in enumerate(np.linspace(inum, -inum,inum*2+1)):
grid[i * resolution:(i + 1) * resolution, j * resolution:(j + 1) * resolution]
= julia((c[0]+re*step,c[1]+im*step), zoom=zoom, resolution=resolution, maxstep=maxstep)
print("Progress: "+str(progress)+"/"+str((2*rnum+1)*(2*inum+1)))
progress += 1

plt.imsave("sensitivity_"+cm+".png", grid,cmap=cm)
plt.subplot(1,len(paras),num+1)
plt.imshow(grid,cmap=cm)
xticks = np.linspace(int(resolution / 2), int(grid.shape[1] - resolution / 2), rnum)
xlabels = ["{0:.2f}".format(i) for i in np.linspace(c[0]-rnum*step, c[0]+rnum*step, rnum*2)]
plt.xticks(xticks, xlabels)
yticks = np.linspace(int(grid.shape[0] - resolution / 2), int(resolution / 2), inum)
ylabels = ["{0:.2f}".format(i) for i in np.linspace(c[0]-inum*step, c[0]+inum*step, inum*2)]
plt.yticks(yticks, ylabels)
plt.xlabel("Real")
plt.ylabel("Imaginary")
plt.title(cm+": "+str(c))

plt.show()

就算我提高解析度,迭代次數翻一倍,還是到底有個卵區別?????????!!!!

。。。。。。。。。。。。。。。。。。。。。。。。。迭代40次也沒有卵用

好了終於能看出區別了,可以看出圖案從中心原點「裂開」的過程。節目結果也說明了這是組比較敏感的參數。(0,0)這個點從有到無說明這組參數落在了Mandelbrot Set的邊界附近。

所以結論是,

1. 參賽者眼神很好。太好了。至於說現場迭代算是不可能的,電腦跑這個幾個圖的時間都比節目里的時限長。別的答案也介紹了參賽選手的背景,是記憶大師。只要熟悉這幾個參數附近的圖片,找出不同的地方即可。

2. 難不難?非常難,如果真如節目所說,參賽者實際不知道這幾個圖參數的範圍。但我認為參賽者是知道的,這幾個參數都是經典的那幾個漂亮圖案,這樣顯然能更吸引觀眾。如果參賽者的範圍限制在這幾個參數,還是可以理解的。再比如那個綠色的,應該圖案對c很敏感。過一段時間再去驗證。但眼神也太好了點,這還是一般人做不到的。

3. 節目組的代碼寫的不錯。

最後掛幾個Julia Set放大圖。Julia Set還是很好理解的,會算複數乘法就行了。


謝邀。

這幾天3,4個邀請回答同樣的問題,搞得我自己都好奇得去看了一下到底是怎麼回事了。。

首先說一下我理解的遊戲規則:迭代函數是給定的: f(z)=z^2+c。根據不同的初始圖案(他挑戰3套不同的圖案應該來源於迭代的初始圖案不一樣)和不同的參數c的取值(注意c是個複數,他要猜的x和y是c的實部和虛部;z也是複數,整個迭代是在複平面上面進行的。這個迭代函數在分形幾何裡面應該也是挺經典的迭代函數,生成的分形集也有個名字,好像叫Julia集),生成不同的圖案。然後選手可以知道每套25張圖形裡面的3張的參數c值(這相當於解微分方程的時候需要給定初值或者邊值條件),然後挑戰的時候3套圖形任意選1張,要求他猜對應的參數c,精確到0.002.

總體來說難度還是有點大的。因為這些圖形對參數c的依賴是很敏感的,最後第3道題,大家可以看到他猜的參數值和實際參數值的誤差其實並不大,但是圖形的差別已經有點大了(中間的洞的大小明顯不一樣)。其實就類似於蝴蝶效應——參數的微小誤差最終積累成可見的大誤差。所以要推理出非常精確的參數值是很難的,基本上也不可能單純靠數學計算去算出來,很大程度還是依靠他對圖形之間的細微差異的精確感知,以及他對圖形和參數對應關係的大腦直覺。


去查了一下,這位同學本科還是數學系的。。。

按照「數學系的學生,本科四年畢業,應該知道自己不能做什麼」的標準,這個人是不能畢業的。。。

——原答案——

昨天收到一個學弟微信,問我有沒有什麼巧辦法去判斷這個。聽完對方不太清晰的題意描述,我瞬間對這個猜圖過程打不起任何興趣,尤其是,我看到了,【分形】。。。

我賭五毛人民幣,陶哲軒都不能暴力算!陶男神要是能暴力算,我給他五毛,有什麼嘛!口亨!

至於如何評價該同學的表現?一句很嚴重並帶有我強烈的個人感情色彩的話:被「算術」綁架的表演者。

可能「算術」還算客氣了。

比起科研,我想,可能中國廣大人民群眾更需要科普吧= =

恕我直言,那麼好的題目背景,被搞成這樣真是喪盡天良、掉盡節操。


知乎有真人,就是余彬晶,我看到他點了關注就來了 ,有圖,他之前回答過有關記憶的問題。


高等數學,只略懂微積分、線性代數、複變函數的人飄過,你們說的我完全不懂唉~


推薦閱讀:

如何看待王峰站邊余奕沛暗?水哥王昱珩?
如何評價《最強大腦》裡面的陶晶瑩?
如何評價最強大腦上任志強炮轟dr.魏「神經病」?
最強大腦郭敬明和dr.魏就"我怎麼好像跟女人在吵架,老是翻舊賬"事件,如何評價dr.魏的表現?
你是怎麼評價王昱珩的?

TAG:數學 | 最強大腦電視節目 |