Post by marcofuicsVorrei introdurre gli studenti (14enni liceo) all'uso del calcolatore per la fisica. Quale argomento mi suggerite più cool per il connubio phy-ict (non so, approx numeriche?... or else) e se Linux o Windows (particolari sw o semplice Nash) o risorse sw/web?
Python+scipy
esempio di programmino di circa 100 righe (gravita`, corpi rigidi, fisica galileiana, attrito, integrazione):
inizio codice:
import numpy as np
import time
from matplotlib import pyplot as plt
import matplotlib.animation as animation
def update(i):
global x,lastX,nextX,v,a,passo,passok,m,gg,passo1,passo2,f
t=16
dt=1.0/t
f=f+1
if f<50:
passo[mm[0]==42]*=1.01
passo[mm[1]==42]*=1.01
if f>50 and f<100:
passo[mm[0]==42]/=1.01
passo[mm[1]==42]/=1.01
passo[mm[0]==46]/=1.01
passo[mm[1]==46]/=1.01
if f>100 and f<150:
passo[mm[0]==46]*=1.01
passo[mm[1]==46]*=1.01
if f>150:
f=0
for i in range(t):
a1=np.zeros(x.shape)
a1[:,1]=-gg*dt
g=np.where(x[:,1]<-1)
a1[g]*=[0,-100]
diff=np.squeeze(np.diff(x[mm],axis=0))
d=np.sqrt(np.sum(diff**2,axis=1))
difference=(d-passo)/d
t=(diff*.5*difference[:,np.newaxis])*dt*passok[:,np.newaxis]
np.add.at(x,mm[0],np.squeeze((t[:,np.newaxis])))
np.add.at(x,mm[1],-np.squeeze((t[:,np.newaxis])))
v=x-lastX
v[g]=0
nextX=x+v+a1*dt*dt
lastX=x
x=nextX
scat.set_offsets(x[m])
n=13
x=np.stack(np.meshgrid(np.linspace(0,n,n),np.linspace(0,n,n))).reshape((2,-1)).swapaxes(0,1)
passo=n/(n-1)
mm=np.concatenate(
(np.repeat(np.arange(n*n).reshape((n,n)),2,axis=1)[:,1:-1].reshape((-1,2)).T,
np.repeat(np.arange(n*n).reshape((n,n)),2,axis=0)[1:-1].T.reshape((-1,2)).T.reshape((2,-1)),
(np.dstack([np.arange(n*0,n*(n-1)),np.arange(n*1+1,n*n+1)]).reshape((n-1,-1))[:,:-2]).reshape((-1,2)).T,
(np.dstack([np.arange(n*0+1,n*(n-1)+1),np.arange(n*1,n*n)]).reshape((n-1,-1))[:,:-2]).reshape((-1,2)).T
),axis=1)
k1=np.squeeze(np.diff(x[mm],axis=0))
passo=np.sqrt(np.sum(k1**2,axis=1))
passok=np.zeros(len(passo))
v=np.zeros(x.shape)
lastX=x
ar=[3096, 3099, 3611, 3643, 4091, 8187, 8183, 4095, 2047, 118, 126, 124, 60]
k1=np.zeros((n,n))
for i in range(len(ar)):
k=i*n
m=(np.array(list(np.binary_repr(ar[i],n)),dtype='int8'))
k1[i]=((m*np.arange(n)+k)*m)
for j in k1[k1!=0]:
passok+=np.logical_or(mm[0]==j,(mm[1]==j))
passok=passok>1
m=(k1!=0).flatten()
nextX=np.zeros(x.shape)
fig = plt.figure(figsize=(7, 7))
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.set_xlim(-n*2, n*2), ax.set_xticks([])
ax.set_ylim(-n*2, n*2), ax.set_yticks([])
scat = ax.scatter(x[0],x[1],s=10*n)
gg=0.1
f=0
ani = animation.FuncAnimation(fig, update, interval=16,save_count=400)
plt.show()
fine codice
risultato (elefante molliccio che cammina all`indietro puntellandosi con la proboscide):
Loading Image...