MATLABで学ぶ振動工学 メタマテリアル・周期構造 2

はじめに

前回、メタマテリアルの記事を紹介する際に下記のツイートをしました。

ツイートをした後に、「あれ?これって正しいのかな?」と疑心暗鬼になりました。

そこで、本日は上記ツイートを検証したいと思います。

バネマス系での検証

1原子1次元格子

図1のような質量mとバネkが連続するモデルで、自由度を増やしていって共振周波数がサチるかを検証したいと思います。(なお、片端は拘束しました。)

図1

検証結果は以下になりました。

図2

サチってますね。片端拘束なので、ωn=√(2k/m)、fn=ω/(2π)よりも最大共振周波数が高くなっていますが、ご了承ください。

clear all
close all
clc

dof=2.^(2:12);

figure
for ii1=1:length(dof)

m_vec=ones(1,dof(ii1));
[M]=eval_Mmatrix(m_vec);
k_vec=ones(1,dof(ii1))*10^3;
[K]=eval_Kmatrix(k_vec);

% [V,D]=eigs(K,M);
[V,D]=eigs(K,M,dof(ii1));
% [V,D]=eigs(K,M,dof(ii1),'LM');
fn=sqrt(diag(D))/(2*pi);
fnmax=max(fn);
semilogx(dof(ii1),fnmax,'o')
hold on
end

MATLABのコード

functionファイル

function [K]=eval_Kmatrix(k_vec)
K=sparse(length(k_vec),length(k_vec));
% K=zeros(length(k_vec)); 
for ii1=1:length(k_vec) 
    if ii1==1 K(ii1,ii1)=k_vec(ii1); 
    else 
        K(ii1-1:ii1,ii1-1:ii1)=K(ii1-1:ii1,ii1-1:ii1)+[1 -1;-1 1]*k_vec(ii1);
    end
end
end
function [M]=eval_Mmatrix(m_vec)
% M=sparse(length(m_vec),length(m_vec));
M=sparse( diag(m_vec) );
end

 

コメント