You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

442 lines
15 KiB
Matlab

function collision_physics
%calculate which mass is heaviest from observations of initial velocities and velocities after collision. Velocities match those used in corresponding psychophysics experiments (in cm/s). Mass ratios also match those used in corresponding psychophysics experiments.
figoff=20;
Vinp=[-12:1:12];
Vcen=[-6:2:6];
Einp=[-0.4:0.2:1.4];
Ecen=[0:0.25:1];
Rinp=[1:-1:-1];
Rcen=[1/3,1/2,1,2,3];
expon=2;
precV=0.03; %precision to encode velocities
%define weights of prediction neurons representing a range of perfectly elastic collisions
W=[];
for ua=Vcen
for ub=Vcen
for e=Ecen
for r=Rcen
[va,vb]=post_collision_velocities(r,1,ua,ub,e);
if ua>ub && va<=ua && vb>=ub %necessary for there to be a collision
if (vb-ub)>(ua-va), rr=1; %Ma larger
elseif (vb-ub)<(ua-va), rr=-1; %Mb larger
else rr=0; %Ma=Mb
end
W=[W;code(ua,Vinp,0.5),code(ub,Vinp,0.5),code(va,Vinp,0.5),code(vb,Vinp,0.5),code(e,Einp,10),code(rr,Rinp,10)];%code(log(r),Rinp,10)];
end
end
end
end
end
[n,m]=size(W)
nullE=zeros(1,length(Einp));
nullR=zeros(1,length(Rinp));
%simulate Expt 1 of Todd & Warren
Ua=[1.19:0.13:4.45];
mb=1;
Ma=[1.25,1.5,2,3];
E=[0.9,0.5,0.1];
num=zeros(length(E),length(Ma));
est=zeros(length(E),length(Ma));
k=0;
for e=E
k=k+1;
j=0;
for ma=Ma
j=j+1;
for ua=Ua
ub=ua-6.35;
[va,vb]=post_collision_velocities(ma,mb,ua,ub,e);
x=[code(ua,Vinp,precV),code(ub,Vinp,precV),code(va,Vinp,precV),code(vb,Vinp,precV),nullE,nullR]';
[y,~,r]=dim_activation(W,x);
predict=r(m-length(Rinp)+1:m)'.^expon;
chooseA=0.5+0.5.*sum(Rinp.*predict)./sum(predict);
est(k,j)=est(k,j)+chooseA;
num(k,j)=num(k,j)+1;
end
end
end
est=est./num;
figure(figoff+1),clf
semilogx(Ma,est(1,:),'m-d','LineWidth',2,'MarkerFaceColor','m','MarkerSize',9),hold on
semilogx(Ma,est(2,:),'b-s','LineWidth',2,'MarkerFaceColor','b','MarkerSize',9)
semilogx(Ma,est(3,:),'g-o','LineWidth',2,'MarkerFaceColor','g','MarkerSize',9)
semilogx([1,3],[0.5,0.5],'k--')
set(gca,'XTick',[1,1.5,3],'XTickLabel',['1/1';'3/2';'3/1'],'FontSize',12)
xlabel('m_A/m_B');ylabel('proportion choosing object A')
set(gcf,'PaperSize',[6 9],'PaperPosition',[0 0.25 6 9],'PaperOrientation','Portrait');
print(gcf, '-dpdf','collision_physics1.pdf');
%simulate Expt 2 of Todd & Warren - moving condition
ua=3.18;
ub=-3.18;
mb=1;
Ma=[1/3,0.5,2/3,1/1.25,1.25,1.5,2,3];
E=[0.9,0.5,0.1];
num=zeros(length(E),length(Ma));
est=zeros(length(E),length(Ma));
k=0;
for e=E
k=k+1;
j=0;
for ma=Ma
j=j+1;
[va,vb]=post_collision_velocities(ma,mb,ua,ub,e);
x=[code(ua,Vinp,precV),code(ub,Vinp,precV),code(va,Vinp,precV),code(vb,Vinp,precV),nullE,nullR]';
[y,~,r]=dim_activation(W,x);
predict=r(m-length(Rinp)+1:m)'.^expon;
chooseA=0.5+0.5.*sum(Rinp.*predict)./sum(predict);
est(k,j)=est(k,j)+chooseA;
num(k,j)=num(k,j)+1;
end
end
est=est./num;
figure(figoff+2),clf
semilogx(Ma,est(1,:),'m-d','LineWidth',2,'MarkerFaceColor','m','MarkerSize',9),hold on
semilogx(Ma,est(2,:),'b-s','LineWidth',2,'MarkerFaceColor','b','MarkerSize',9)
semilogx(Ma,est(3,:),'g-o','LineWidth',2,'MarkerFaceColor','g','MarkerSize',9)
semilogx([1,1],[0,1],'k--')
semilogx([1/3,3],[0.5,0.5],'k--')
set(gca,'XTick',[1/3,2/3,1,1.5,3],'XTickLabel',['1/3';'2/3';'1/1';'3/2';'3/1'],'FontSize',12)
xlabel('m_A/m_B');ylabel('proportion choosing object A')
set(gcf,'PaperSize',[6 9],'PaperPosition',[0 0.25 6 9],'PaperOrientation','Portrait');
print(gcf, '-dpdf','collision_physics2.pdf');
%simulate Expt 2 of Todd & Warren - stationary condition (reproduced in Fig.5 of Sanborn, Mansinghka, and Griffiths)
ua=3.18;
ub=0;
mb=1;
Ma=[1/3,0.5,2/3,1/1.25,1.25,1.5,2,3];
E=[0.9,0.5,0.1];
num=zeros(length(E),length(Ma));
est=zeros(length(E),length(Ma));
k=0;
for e=E
k=k+1;
j=0;
for ma=Ma
j=j+1;
[va,vb]=post_collision_velocities(ma,mb,ua,ub,e);
x=[code(ua,Vinp,precV),code(ub,Vinp,precV),code(va,Vinp,precV),code(vb,Vinp,precV),nullE,nullR]';
[y,~,r]=dim_activation(W,x);
predict=r(m-length(Rinp)+1:m)'.^expon;
chooseA=0.5+0.5.*sum(Rinp.*predict)./sum(predict);
est(k,j)=est(k,j)+chooseA;
num(k,j)=num(k,j)+1;
end
end
est=est./num;
figure(figoff+3),clf
semilogx(Ma,est(1,:),'m-d','LineWidth',2,'MarkerFaceColor','m','MarkerSize',9),hold on
semilogx(Ma,est(2,:),'b-s','LineWidth',2,'MarkerFaceColor','b','MarkerSize',9)
semilogx(Ma,est(3,:),'g-o','LineWidth',2,'MarkerFaceColor','g','MarkerSize',9)
semilogx([1,1],[0,1],'k--')
semilogx([1/3,3],[0.5,0.5],'k--')
set(gca,'XTick',[1/3,2/3,1,1.5,3],'XTickLabel',['1/3';'2/3';'1/1';'3/2';'3/1'],'FontSize',12)
xlabel('m_A/m_B');ylabel('proportion choosing object A')
set(gcf,'PaperSize',[6 9],'PaperPosition',[0 0.25 6 9],'PaperOrientation','Portrait');
print(gcf, '-dpdf','collision_physics3.pdf');
%simulate experiment shown in Fig.4 of Runesun and Vedeler
Mb=[0.25,0.37,0.55,0.82,1.22,1.81,2.69,4];
ma=1;
e=0.9;
num=zeros(4,length(Mb));
est=zeros(4,length(Mb));
for condition=1:4
if isodd(condition)
ua=3; ub=-1;
else
ua=5; ub=1;
end
ua=ua*5.1/4;
ub=ub*5.1/4;
j=0;
for mb=Mb
j=j+1;
[va,vb]=post_collision_velocities(ma,mb,ua,ub,e);
if condition<2.5
x=[code(ua,Vinp,precV),code(ub,Vinp,precV),code(va,Vinp,precV),code(vb,Vinp,precV),nullE,nullR]';
else
x=[0.*code(ua,Vinp,precV),0.*code(ub,Vinp,precV),code(va,Vinp,precV),code(vb,Vinp,precV),nullE,nullR]';
end
[y,~,r]=dim_activation(W,x);
predict=r(m-length(Rinp)+1:m)'.^expon;
chooseA=0.5+0.5.*sum(Rinp.*predict)./sum(predict);
est(condition,j)=chooseA;
end
end
figure(figoff+4),clf
%semilogx(Mb,est(1,:),'y-o','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),hold on
%semilogx(Mb,est(2,:),'y-s','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9)
%semilogx(Mb,est(3,:),'y-o','LineWidth',2,'MarkerFaceColor','m','MarkerSize',9)
%semilogx(Mb,est(4,:),'y-s','LineWidth',2,'MarkerFaceColor','m','MarkerSize',9)
semilogx(1./Mb,mean(est(1:2,:)),'m-d','LineWidth',2,'MarkerFaceColor','m','MarkerSize',9),hold on
semilogx(1./Mb,mean(est(3:4,:)),'m--d','LineWidth',2,'MarkerFaceColor','m','MarkerSize',9)
semilogx([1,1],[0,1],'k--')
semilogx([1/4,4],[0.5,0.5],'k--')
set(gca,'XTick',[1/4,1/2,1,2,4],'XTickLabel',['1/4';'1/2';'1/1';'2/1';'4/1'],'FontSize',12)
xlabel('m_A/m_B');ylabel('proportion choosing object A')
set(gcf,'PaperSize',[6 9],'PaperPosition',[0 0.25 6 9],'PaperOrientation','Portrait');
print(gcf, '-dpdf','collision_physics4.pdf');
%simulate experiment shown in Fig.3a of Sanborn
Ua=[1.19:0.13:4.45];
ub=0;
mb=1;
Ma=[1/3,1/1.25,1.25,3];
E=[1,0.1];
num=zeros(length(E),length(Ma));
est=zeros(length(E),length(Ma));
k=0;
for e=E
k=k+1;
j=0;
for ma=Ma
j=j+1;
for ua=Ua
[va,vb]=post_collision_velocities(ma,mb,ua,ub,e);
x=[code(ua,Vinp,precV),code(ub,Vinp,precV),code(va,Vinp,precV),code(vb,Vinp,precV),nullE,nullR]';
[y,~,r]=dim_activation(W,x);
predict=r(m-length(Rinp)+1:m)'.^expon;
chooseA=0.5+0.5.*sum(Rinp.*predict)./sum(predict);
est(k,j)=est(k,j)+chooseA;
num(k,j)=num(k,j)+1;
end
end
end
est=est./num;
figure(figoff+5),clf
semilogx(Ma,est(1,:),'r-+','LineWidth',2,'MarkerFaceColor','r','MarkerSize',9),hold on
semilogx(Ma,est(2,:),'g-o','LineWidth',2,'MarkerFaceColor','g','MarkerSize',9)
semilogx([1,1],[0,1],'k--')
semilogx([1/3,3],[0.5,0.5],'k--')
set(gca,'XTick',[1/3,2/3,1,1.5,3],'XTickLabel',['1/3';'2/3';'1/1';'3/2';'3/1'],'FontSize',12)
xlabel('m_A/m_B');ylabel('proportion choosing object A')
set(gcf,'PaperSize',[6 9],'PaperPosition',[0 0.25 6 9],'PaperOrientation','Portrait');
print(gcf, '-dpdf','collision_physics5.pdf');
scale=0.2;
%simulate experiment shown in Fig.3b of Sanborn (as above but with object B occluded after collision)
Ua=[1.19:0.13:4.45];
ub=0;
mb=1;
Ma=[1/3,1/1.25,1.25,3];
E=[1,0.1];
num=zeros(length(E),length(Ma));
est=zeros(length(E),length(Ma));
k=0;
for e=E
k=k+1;
j=0;
for ma=Ma
j=j+1;
for ua=Ua
[va,vb]=post_collision_velocities(ma,mb,ua,ub,e);
x=[code(ua,Vinp,precV),code(ub,Vinp,precV),code(va,Vinp,precV),scale*code(ub,Vinp,precV),nullE,nullR]';
[y,~,r]=dim_activation(W,x);
predict=r(m-length(Rinp)+1:m)'.^expon;
chooseA=0.5+0.5.*sum(Rinp.*predict)./sum(predict);
est(k,j)=est(k,j)+chooseA;
num(k,j)=num(k,j)+1;
end
end
end
est=est./num;
figure(figoff+6),clf
semilogx(Ma,est(1,:),'r-+','LineWidth',2,'MarkerFaceColor','r','MarkerSize',9),hold on
semilogx(Ma,est(2,:),'g-o','LineWidth',2,'MarkerFaceColor','g','MarkerSize',9)
semilogx([1,1],[0,1],'k--')
semilogx([1/3,3],[0.5,0.5],'k--')
set(gca,'XTick',[1/3,2/3,1,1.5,3],'XTickLabel',['1/3';'2/3';'1/1';'3/2';'3/1'],'FontSize',12)
xlabel('m_A/m_B');ylabel('proportion choosing object A')
set(gcf,'PaperSize',[6 9],'PaperPosition',[0 0.25 6 9],'PaperOrientation','Portrait');
print(gcf, '-dpdf','collision_physics6.pdf');
%simulate experiment shown in Fig.3c of Sanborn (as above but with object A occluded after collision)
Ua=[1.19:0.13:4.45];
ub=0;
mb=1;
Ma=[1/3,1/1.25,1.25,3];
E=[1,0.1];
num=zeros(length(E),length(Ma));
est=zeros(length(E),length(Ma));
k=0;
for e=E
k=k+1;
j=0;
for ma=Ma
j=j+1;
for ua=Ua
[va,vb]=post_collision_velocities(ma,mb,ua,ub,e);
x=[code(ua,Vinp,precV),code(ub,Vinp,precV),scale*code(ua,Vinp,precV),code(vb,Vinp,precV),nullE,nullR]';
[y,~,r]=dim_activation(W,x);
predict=r(m-length(Rinp)+1:m)'.^expon;
chooseA=0.5+0.5.*sum(Rinp.*predict)./sum(predict);
est(k,j)=est(k,j)+chooseA;
num(k,j)=num(k,j)+1;
end
end
end
est=est./num;
figure(figoff+7),clf
semilogx(Ma,est(1,:),'r-+','LineWidth',2,'MarkerFaceColor','r','MarkerSize',9),hold on
semilogx(Ma,est(2,:),'g-o','LineWidth',2,'MarkerFaceColor','g','MarkerSize',9)
semilogx([1,1],[0,1],'k--')
semilogx([1/3,3],[0.5,0.5],'k--')
set(gca,'XTick',[1/3,2/3,1,1.5,3],'XTickLabel',['1/3';'2/3';'1/1';'3/2';'3/1'],'FontSize',12)
xlabel('m_A/m_B');ylabel('proportion choosing object A')
set(gcf,'PaperSize',[6 9],'PaperPosition',[0 0.25 6 9],'PaperOrientation','Portrait');
print(gcf, '-dpdf','collision_physics7.pdf');
corKnown=1
%simulate predictions of post-collision velocities
ua=3.18;
ub=-3.18;
mb=1;
Ma=[1/3,0.5,2/3,1/1.25,1.25,1.5,2,3];
E=[0.9,0.5,0.1];
partitionVa=2*length(Vinp)+[1:length(Vinp)];
partitionVb=3*length(Vinp)+[1:length(Vinp)];
nullV=zeros(1,length(Vinp));
num=zeros(length(E),length(Ma));
est=zeros(length(E),length(Ma));
k=0;
for e=E
k=k+1;
j=0;
for ma=Ma
j=j+1;
if corKnown
x=[code(ua,Vinp,precV),code(ub,Vinp,precV),nullV,nullV,code(e,Einp,10),code(log(ma),Rinp,1)]';
else
x=[code(ua,Vinp,precV),code(ub,Vinp,precV),nullV,nullV,nullE,code(log(ma),Rinp,1)]';
end
[y,~,r]=dim_activation(W,x);
rVa=r(partitionVa)'.^expon;
rVb=r(partitionVb)'.^expon;
predictVa(k,j)=sum(rVa.*Vinp)./sum(rVa);
predictVb(k,j)=sum(rVb.*Vinp)./sum(rVb);
[trueVa(k,j),trueVb(k,j)]=post_collision_velocities(ma,mb,ua,ub,e);
end
end
figure(figoff+8),clf
semilogx(Ma,trueVa(1,:),'m-d','LineWidth',2,'MarkerFaceColor','m','MarkerSize',9),hold on
semilogx(Ma,trueVb(1,:),'m-d','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx(Ma,trueVa(2,:),'b-s','LineWidth',2,'MarkerFaceColor','b','MarkerSize',9),
semilogx(Ma,trueVb(2,:),'b-s','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx(Ma,trueVa(3,:),'g-o','LineWidth',2,'MarkerFaceColor','g','MarkerSize',9),
semilogx(Ma,trueVb(3,:),'g-o','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx([1,1],[-8,8],'k--')
semilogx([1/3,3],[ub,ub],'k--')
semilogx([1/3,3],[ua,ua],'k--')
set(gca,'XTick',[1/3,2/3,1,1.5,3],'XTickLabel',['1/3';'2/3';'1/1';'3/2';'3/1'],'FontSize',12)
xlabel('m_A/m_B');ylabel('actual post-collision velocities')
set(gcf,'PaperSize',[6 9],'PaperPosition',[0 0.25 6 9],'PaperOrientation','Portrait');
print(gcf, '-dpdf','collision_physics8.pdf');
figure(figoff+9),clf
semilogx(Ma,predictVa(1,:),'m-d','LineWidth',2,'MarkerFaceColor','m','MarkerSize',9),hold on
semilogx(Ma,predictVb(1,:),'m-d','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx(Ma,predictVa(2,:),'b-s','LineWidth',2,'MarkerFaceColor','b','MarkerSize',9),
semilogx(Ma,predictVb(2,:),'b-s','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx(Ma,predictVa(3,:),'g-o','LineWidth',2,'MarkerFaceColor','g','MarkerSize',9),
semilogx(Ma,predictVb(3,:),'g-o','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx([1,1],[-8,8],'k--')
semilogx([1/3,3],[ub,ub],'k--')
semilogx([1/3,3],[ua,ua],'k--')
set(gca,'XTick',[1/3,2/3,1,1.5,3],'XTickLabel',['1/3';'2/3';'1/1';'3/2';'3/1'],'FontSize',12)
xlabel('m_A/m_B');ylabel('estimated post-collision velocities')
set(gcf,'PaperSize',[6 9],'PaperPosition',[0 0.25 6 9],'PaperOrientation','Portrait');
print(gcf, '-dpdf','collision_physics9.pdf');
ua=3.18;
ub=0;
mb=1;
num=zeros(length(E),length(Ma));
est=zeros(length(E),length(Ma));
k=0;
for e=E
k=k+1;
j=0;
for ma=Ma
j=j+1;
if corKnown
x=[code(ua,Vinp,precV),code(ub,Vinp,precV),nullV,nullV,code(e,Einp,10),code(log(ma),Rinp,1)]';
else
x=[code(ua,Vinp,precV),code(ub,Vinp,precV),nullV,nullV,nullE,code(log(ma),Rinp,1)]';
end
[y,~,r]=dim_activation(W,x);
rVa=r(partitionVa)'.^expon;
rVb=r(partitionVb)'.^expon;
predictVa(k,j)=sum(rVa.*Vinp)./sum(rVa);
predictVb(k,j)=sum(rVb.*Vinp)./sum(rVb);
[trueVa(k,j),trueVb(k,j)]=post_collision_velocities(ma,mb,ua,ub,e);
end
end
figure(figoff+10),clf
semilogx(Ma,trueVa(1,:),'m-d','LineWidth',2,'MarkerFaceColor','m','MarkerSize',9),hold on
semilogx(Ma,trueVb(1,:),'m-d','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx(Ma,trueVa(2,:),'b-s','LineWidth',2,'MarkerFaceColor','b','MarkerSize',9),
semilogx(Ma,trueVb(2,:),'b-s','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx(Ma,trueVa(3,:),'g-o','LineWidth',2,'MarkerFaceColor','g','MarkerSize',9),
semilogx(Ma,trueVb(3,:),'g-o','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx([1,1],[-2,5],'k--')
semilogx([1/3,3],[ub,ub],'k--')
semilogx([1/3,3],[ua,ua],'k--')
set(gca,'XTick',[1/3,2/3,1,1.5,3],'XTickLabel',['1/3';'2/3';'1/1';'3/2';'3/1'],'FontSize',12)
xlabel('m_A/m_B');ylabel('actual post-collision velocities')
set(gcf,'PaperSize',[6 9],'PaperPosition',[0 0.25 6 9],'PaperOrientation','Portrait');
print(gcf, '-dpdf','collision_physics10.pdf');
figure(figoff+11),clf
semilogx(Ma,predictVa(1,:),'m-d','LineWidth',2,'MarkerFaceColor','m','MarkerSize',9),hold on
semilogx(Ma,predictVb(1,:),'m-d','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx(Ma,predictVa(2,:),'b-s','LineWidth',2,'MarkerFaceColor','b','MarkerSize',9),
semilogx(Ma,predictVb(2,:),'b-s','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx(Ma,predictVa(3,:),'g-o','LineWidth',2,'MarkerFaceColor','g','MarkerSize',9),
semilogx(Ma,predictVb(3,:),'g-o','LineWidth',2,'MarkerFaceColor','w','MarkerSize',9),
semilogx([1,1],[-2,5],'k--')
semilogx([1/3,3],[ub,ub],'k--')
semilogx([1/3,3],[ua,ua],'k--')
set(gca,'XTick',[1/3,2/3,1,1.5,3],'XTickLabel',['1/3';'2/3';'1/1';'3/2';'3/1'],'FontSize',12)
xlabel('m_A/m_B');ylabel('estimated post-collision velocities')
set(gcf,'PaperSize',[6 9],'PaperPosition',[0 0.25 6 9],'PaperOrientation','Portrait');
print(gcf, '-dpdf','collision_physics11.pdf');
function c=code(x,X,precision)
if nargin<3 || isempty(precision), precision=0.5; end
c=exp(-precision.*(x-X).^2);%.*sqrt(precision);
%c=c./sum(c);
function [va,vb]=post_collision_velocities(ma,mb,ua,ub,e)
va=((ma*ua)+mb*(ub+e*(ub-ua)))/(ma+mb);
vb=((mb*ub)+ma*(ua+e*(ua-ub)))/(ma+mb);