~ 量子物理の現状と今後の発展への期待 ~
« 2025年6月 | トップページ | 2025年8月 »
・TDKが車載PoC用広周波数帯域対応巻線インダクタ発表
・everythingRFがRFスイッチマトリクスのeBook発行
・Softbankが量子コンピューティングで5G基地局最適化
・MaxLinearが450Gbpsのストレージアクセラレータ発表
・Infinix GT 30 Pro分解動画
その他
ヒロセ電機:【世界初】高電流と免振構造を両立したコネクタ「FX31」シリーズをリリース
~車載機器の小型化・軽量化・組み立て作業の効率化に貢献~ 2025/7/30
MediaTek shapes the future of connectivity with 6G
・Yoleが2024のRF市場が$51Bと分析
・Qorvoのユースサッカー向けUWB解説
・Huawei Pura 80シリーズ分解動画
[Teardown] Inside the Huawei Pura 80 Series: Full Disassembly and Component Breakdown
・Smiths Interconnectのソルダーレス40GHz同軸コネクタEZiCoax
・Samsungの研究者がアジア太平洋地域の6Gスペクトルを先導
その他
今回はシンプレクティック8次で計算。
こちらの論文から引っ張ってきた。
コードはこんな感じで。
using Plots
#力の計算(x方向)
function fx(k)
G = 1.0
f = 0.0
for i in 1:n
if i != k
R = sqrt((qx[i] - qx[k]) ^ 2 + (qy[i] - qy[k]) ^ 2)
f = f + G * m[k] * m[i] * (qx[i] - qx[k]) / (R ^ 3)
end
end
return f
end
#力の計算(y方向)
function fy(k)
G = 1.0
f = 0.0
for i in 1:n
if i != k
R = sqrt((qx[i] - qx[k]) ^ 2 + (qy[i] - qy[k]) ^ 2)
f = f + G * m[k] * m[i] * (qy[i] - qy[k]) / (R ^ 3)
end
end
return f
end
# 初期設定
n = 3 #星の個数
m = zeros(Float64, n)
qx = zeros(Float64, n)
qy = zeros(Float64, n)
px = zeros(Float64, n)
py = zeros(Float64, n)
dt = 3.0 / 10000.0
#8の字解
#param = [ 0.97000436,-0.5 * 0.93240737,-0.24308753,-0.5 * 0.86473146, -0.97000436,-0.5 * 0.93240737,0.24308753,-0.5 * 0.86473146,0,0.93240737, 0,0.86473146]
#mparam = [1.0, 1.0, 1.0]
#tmax = 10000 #繰り返し回数
#13個見つかった解のうち、クラスI.A.1のbutterfly I
vx1 = 0.30689
vy1 = 0.12551
param =[-1.0, vx1, 0.0, vy1, 1.0, vx1, 0.0, vy1, 0.0 , -2.0*vx1, 0.0, -2.0*vy1]
mparam = [1.0, 1.0, 1.0]
tmax = 30000 #繰り返し回数
m[1] = mparam[1]
m[2] = mparam[2]
m[3] = mparam[3]
qx[1] = param[1]
qy[1] = param[3]
px[1] = param[2]
py[1] = param[4]
qx[2] = param[5]
qy[2] = param[7]
px[2] = param[6]
py[2] = param[8]
qx[3] = param[9]
qy[3] = param[11]
px[3] = param[10]
py[3] = param[12]
#表示用
x = zeros(Float64, n, tmax)
y = zeros(Float64, n, tmax)
x[1, 1] = qx[1]
y[1, 1] = qy[1]
x[2, 1] = qx[2]
y[2, 1] = qy[2]
x[3, 1] = qx[3]
y[3, 1] = qy[3]
# 8次のシンプレクティック積分公式の係数
w = zeros(Float64, 8)
d = zeros(Float64, 16)
c = zeros(Float64, 16)
w[1] = 0.311790812418427
w[2] = -1.55946803821447
w[3] = -1.6789692825964
w[4] = 1.66335809963315
w[5] = -1.06458714789183
w[6] = 1.36934946416871
w[7] = 0.629030650210433
w[8] = 1.0 - 2.0 * (w[1] + w[2] + w[3] + w[4] + w[5] + w[6] + w[7])
d[1] = w[7]
d[15] = w[7]
d[2] = w[6]
d[14] = w[6]
d[3] = w[5]
d[13] = w[5]
d[4] = w[4]
d[12] = w[4]
d[5] = w[3]
d[11] = w[3]
d[6] = w[2]
d[10] = w[2]
d[7] = w[1]
d[9] = w[1]
d[8] = w[8]
d[16] = 0.0
c[1] = 0.5 * w[7]
c[16] = 0.5 * w[7]
c[2] = 0.5 * (w[7] + w[6])
c[15] = 0.5 * (w[7] + w[6])
c[3] = 0.5 * (w[6] + w[5])
c[14] = 0.5 * (w[6] + w[5])
c[4] = 0.5 * (w[5] + w[4])
c[13] = 0.5 * (w[5] + w[4])
c[5] = 0.5 * (w[4] + w[3])
c[12] = 0.5 * (w[4] + w[3])
c[6] = 0.5 * (w[3] + w[2])
c[11] = 0.5 * (w[3] + w[2])
c[7] = 0.5 * (w[2] + w[1])
c[10] = 0.5 * (w[2] + w[1])
c[8] = 0.5 * (w[1] + w[8])
c[9] = 0.5 * (w[1] + w[8])
for i in 2:tmax
for k in 1:16
for j in 1:n
qx[j] = qx[j] + dt * c[k] * px[j] / m[j]
qy[j] = qy[j] + dt * c[k] * py[j] / m[j]
end
for j in 1:n
px[j] = px[j] + dt * d[k] * fx(j)
py[j] = py[j] + dt * d[k] * fy(j)
end
end
for j in 1:n
x[j, i] = qx[j]
y[j, i] = qy[j]
end
end
|
アニメーションにするには
まずは有名な8の字解。
次はこちらの論文に乗っていた13個見つかった解のうち、クラスI.A.1のbutterfly I
他のもやろうと思ったが、刻み幅一定だと、いくら8次でも衝突が多いような解は発散してしまう…
ちょっといまいち。
だがDifferentialEquations.jlのアダプティブな刻み華で、誤差を小さくしたものなら計算できる。
クラスII.C.3a yin-yang IIならばこんな風に面白い動きが再現できる。
・ ヒロセ電機がプローブのエス・イー・アールを子会社化
株式会社エス・イー・アールの株式の取得(子会社化)に関するお知らせ (207KB)
・AmphenolがJFLCOからRFコンポーネントのNarda-MITEQを買収
・STMがNXPのMEMSビジネスを買収
・Samsung Galaxy Fold 7分解動画でやっぱり5Gミリ波AiPは一個でRFはフレキに通している
今年に入って4回目の大阪市立美術館。今回はゴッホ展。
ゴッホの死後、すぐに弟テオも死んでしまい、残された妻のヨーがゴッホ作品を相続するが、義理の兄の作品を世に出すために奔走するのは漠然とは知っていたがこれほどスポットライトが当たった展覧会はなかったのでは。その後、息子のフィンセント(義兄と同じ名前)と美術館も設立する。この2人がいなかったら今ほどゴッホはメジャーじゃなかったのではと思わせる。
展示も年代を追ってゴッホの作品や購入した作品が並べられ、要所要所で動画で解説が入るのでとてもわかりやすかった。
作品としては画家としての自画像や、種まく人がよかった。
最後は巨大スクリーンで。立体的にしたひまわりも観られます。
牛丼チェーンで辛さがありそうなものがいくつかでていたので試してみる。
まずは松屋でスリランカのデビルチキン。
これは結構辛くて、私にはちょうどいい感じ。チキンもゴロゴロで美味しい。
次はすき家のニンニクの芽牛丼。中盛にしてみた。
これも結構いい感じの辛さでニンニクの芽がシャキシャキで牛丼に合ってる。
最後はなか卯の旨辛チゲ風親子丼。
一口目は、おっチゲっぽいと思ったが、だんだん普通の親子丼ぽくなっていくのでこれは辛いの苦手な人でも大丈夫とおもう。
とろたまやチーズのトッピングもあるし。
餃子の王将では7月限定の麻婆茄子焼そばをいただく。麺が香ばしく焼けていてそこに茄子の食感がよくて美味しかった。
またこのピッチドロップ実験の記事のアクセスが多くなってきた。
そういや大体1年に一回、7月に確認していたので今回も見てみよう。
ライブで動画が見られるのはこちらから。
https://vimeo.com/event/4721898
では去年、おととしと比較してみる。
いつ落ちるかは2027年と予想している。
ワンピースのルフィを最初に見たときに既視感が…と思ったらこれだった!
IMAXで観るとキラカードもらえる。
とにかくレトロな雰囲気が新鮮。でも何十年も前に未来はこうなるだろうというようなことができてなかったり、逆に全然思ってもいないことができてたり(超高速で飛べるのに超音波エコーがないとか、それこそ磁気テープがまだつかわれているとか)面白い。
その磁気テープが顔のロボットのハービー(そもそもオープンリールの磁気テープがコンピュータの記憶デバイスだったことを若い人はしらないのであれは何?とおもっただろう)がかわいい。後ろが目覚まし時計の裏(電池ボックスあったり)みたいだ。
あとロケットのコンテナの降り方がサンダーバード2号っぽいのがよかった。インターステラーが出てからブラックホールの描写が変わったこともわかる。
アヴェンジャーズはもう強い奴のインフレ(by さるマン)が行きつくしたので、こういう強大な敵(Xライダーのキングダークか大魔神かと…)に対しては全然無力なヒーローチームが新鮮。力でなくて知恵と科学で何とかするのだった。4人のキャラ付けもはっきりしていてそこもいい。
しかし次はアヴェンジャーズ?年代が全く違うのはどうするんだろう…と思ったら別次元からやってくることにするらしい。ってあ、サンダーボルツ*の最後そういうことか。
次も楽しみ。
・QualcommによるWi-Fi 8(IEEE802.11bn)解説
・SequansがSDR用トランシーバチップIris発表
・Wireless Infrastructure Association(WIA)のAIネイティブ6G解説
・トランプ政権のAIアクションプラン解説
AI Action Plan aims to boost infrastructure, export tech and repeal limitations on AI
その他:
Mini-Circuits:Additive Phase Noise Pt. 3
今回はこの例題。
まずは正規分布。
次はガンマ分布。
・Qualcommの6Gのユーザーエクスペリエンスウェビナー開催
https://content.rcrwireless.com/webinar-empowering-next-generation-user-experiences-at-scale-with-6g
・Qualcommは地政学は6Gに影響しないと楽観視
Qualcomm is optimistic geopolitics won't tear 6G apart
・everythingRFのRFミキサeBook
・Otava RFの11GHzまでのチューナブルBPF
TDGL方程式(Time Dependent Ginzburg Landau)のオーダーパラメータは保存するものと保存しないものがある。
保存するものはCahn-Hillard方程式とよく呼ばれてこんな形。
∂φ/∂t=∇²(φ³ -φ-∇²φ)
非保存のものはAllen-Cahn方程式と呼ばれることもあってこんな形。
∂φ/∂t=φ-φ³+∇²φ
ではそれぞれのコードは
保存
using Plots
using Printf
using Random
function main()
#パラメータ設定
n = 128
m = 5000
ndiv = 20
dt = 0.01
dx = 1.0
1
#初期設定
X1 = zeros(n + 2, n + 2)
Y1 = zeros(n + 2, n + 2)
X2 = zeros(n + 2, n + 2)
MT = MersenneTwister()
Random.seed!(MT, 42)
@inbounds for j in 2:(n + 1)
@inbounds @simd for i in 2:(n + 1)
X1[i, j] = 0.1 * (2.0 * rand(MT) - 1.0)
end
end
# 結果を格納する配列
results = []
for t in 1:m
#境界条件
@inbounds for i in 2:(n + 1)
X1[1, i] = X1[2, i]
X1[n + 2, i] = X1[n + 1, i]
X1[i, 1] = X1[i, 2]
X1[i, n + 2] = X1[i, n + 1]
end
#一つ目のラプラシアン
@inbounds for j in 2:(n + 1)
@inbounds @simd for i in 2:(n + 1)
lapX = (X1[i + 1, j] + X1[i - 1, j] + X1[i, j + 1] + X1[i, j - 1] - 4.0 * X1[i, j]) / (dx * dx)
Y1[i, j] = X1[i, j] * (X1[i, j]^2 - 1.0) - lapX
end
end
#境界条件
@inbounds for i in 2:(n + 1)
Y1[1, i] = Y1[2, i]
Y1[n + 2, i] = Y1[n + 1, i]
Y1[i, 1] = Y1[i, 2]
Y1[i, n + 2] = Y1[i, n + 1]
end
#TDGL計算
@inbounds for j in 2:(n + 1)
@inbounds @simd for i in 2:(n + 1)
lapY = (Y1[i + 1, j] + Y1[i - 1, j] + Y1[i, j + 1] + Y1[i, j - 1] - 4.0 * Y1[i, j]) / (dx * dx)
X2[i, j] = X1[i, j] + dt * lapY
end
end
@inbounds for j in 2:(n + 1)
@inbounds @simd for i in 2:(n + 1)
X1[i, j] = X2[i, j]
end
end
# ndivステップごとに結果を配列に格納
if t % ndiv == 0
push!(results, copy(X1))
end
end
# 計算結果をアニメーションで表示
anim = @animate for i in 1:length(results)
heatmap(results[i], title="t = $(@sprintf("%.3f", i * ndiv * dt))", clim=(-1.2, 1.2), size = (950, 800))
end
gif(anim, "Cahn-Hillard.gif", fps = 10)
end
|
非保存
using Plots
using Printf
using Random
function main()
#パラメータ設定
n = 128
m = 5000
ndiv = 20
dt = 0.01
dx = 1.0
1
#初期設定
X1 = zeros(n + 2, n + 2)
X2 = zeros(n + 2, n + 2)
MT = MersenneTwister()
Random.seed!(MT, 42)
@inbounds for j in 2:(n + 1)
@inbounds @simd for i in 2:(n + 1)
X1[i, j] = 0.1 * (2.0 * rand(MT) - 1.0)
end
end
# 結果を格納する配列
results = []
for t in 1:m
#境界条件
@inbounds for i in 2:(n + 1)
X1[1, i] = X1[2, i]
X1[n + 2, i] = X1[n + 1, i]
X1[i, 1] = X1[i, 2]
X1[i, n + 2] = X1[i, n + 1]
end
#境界条件
@inbounds for i in 2:(n + 1)
X1[1, i] = X1[2, i]
X1[n + 2, i] = X1[n + 1, i]
X1[i, 1] = X1[i, 2]
X1[i, n + 2] = X1[i, n + 1]
end
#TDGL計算
@inbounds for j in 2:(n + 1)
@inbounds @simd for i in 2:(n + 1)
lapX = (X1[i + 1, j] + X1[i - 1, j] + X1[i, j + 1] + X1[i, j - 1] - 4.0 * X1[i, j]) / (dx * dx)
X2[i, j] = X1[i, j] + dt *(X1[i, j] * (1.0 - X1[i, j]^2) + lapX)
end
end
@inbounds for j in 2:(n + 1)
@inbounds @simd for i in 2:(n + 1)
X1[i, j] = X2[i, j]
end
end
# ndivステップごとに結果を配列に格納
if t % ndiv == 0
push!(results, copy(X1))
end
end
# 計算結果をアニメーションで表示
anim = @animate for i in 1:length(results)
heatmap(results[i], title="t = $(@sprintf("%.3f", i * ndiv * dt))", clim=(-1.2, 1.2), size = (950, 800))
end
gif(anim, "Allen-Cahn.gif", fps = 10)
end
|
結果を動画で比較する。
保存
非保存
保存するものは一回構造ができるとほぼ動かないが、非保存のものは島が生成消滅が続く。
テレビの前の君に問題を出すぞ、挑戦してみろ、から始まったピタゴラミングスイッチ。
百科おじさん登場。まず登場するのは
「でじでじタイル人」。ドット絵が壁のタイルに動く。タイルによって大きさが変わる。大きなタイルでは大きくなる。
あれ?すぐ退場。並び方を見るとパターンは変わっていない。つなぎ方が一緒(グラフ理論か)。
-----
今日のフルーツは、こういう線で切ります、と線のみが現れる。
上から一本ざっくり、次に横線2本でざく、横線4本で…
スイカだった。てじゅんがだいじ。
----
こんなこともあろうかと装置。ピタゴラスイッチで、、、ボールが落ちたがこんなこともあろうかと戻る。
-----
まっすぐ板のスキマー。今日の抜け道問題。
角に1/4円2つがあるような狭い通路。板が進む。曲がり角を奥まで行って回って通る。次は角が丸い、のも通る。
次は凸形の円もすり抜ける。
ソファ問題みたいだ。あっちは通る方が曲がっているけれどこれは板が回る。

あたまのなかでためす。
----
なんのプログラム?
しずめる
泳がせる
まだ赤い? あかいなら泳がせる
赤くないなら引き上げる。
食べる
これはしゃぶしゃぶを食べるプログラムでした。
----
装置評論家のトンカッチがピタゴラスイッチに出てくる方向転換シーソーを解説。
青いシャツの男の人に作ってもらう。まずシーソーを普通に作っただけではただボールが通り抜ける。
シーソーのはじにボールを止めるストッパーを付ける。今度はボールが止まる。
ボールの重さでシーソーが動かない。シーソーの中心をずらす。完成か?
レースを置いてボールを転がす。ボールがレールに乗ると消しゴムがはねた。軽すぎる?
南京錠を持ってきた。おお、これで方向転換シーソー完成した。
ためして失敗を繰り返すのが醍醐味。トライ&エラー
ーーーー
またでじでじタイルじんが登場。
と思ったら鳩に追われて退場。
ーーーー
すこし不思議な歌のコーナー。
あ い ま さつ あいがさ ぼう が い つぶ やどり ざ える
何?
繋ぐと言葉が見える。枝分かれ歌。線で上から繋ぐ。
あまがえる あまやどり あいす あまい あまやどり
あいぼう あいさつ…などなど。
----
タテひこ、ヨコひこのコーナー。
ペンプロッタでヨコしか動かないヨコひこ、タテにしか動かないタテひこが絵を描く。
曲がった線は描ける?ヨコひこが行ったり来たりするからタテひこがゆっくり引いてくれと。
あれ?ジグザグになってしまった。
ヨコの動きをはじっこをすばやく折り返していたが今度はゆっくり折り返す(正弦波にしてる)。
正弦波の波線ができた。
次はタテひこがゆっくり折り返す。ヨコひこは横に動くだけ。
ヨコの波線(正弦波)が描けた。
2人一緒にすると…?
まるが描けた!リサージュ図形だ。

くみあわせがだいじ。
・サムスン電機(SEMCO)はAIサーバーと車載向けMLCCに注力
・Perasoの60GHzミリ波モジュールがTachyon Networksに採用
・Copper Mountain Technologiesが75Ω12ポートVNAエクステンダ発表
・TDKのPLC用パルストランスポータル
本当は公開当日に観に行く予定でチケットとっていたが急用で断念…やっと観られた。一言でいうと「クリプト!」
スーパーマンというととにかく最強で弱さを見せないイメージだが、本作ではもう最初っからボロボロにやられている。
予告編は冒頭のシーンだった。クリプトに助けられて基地に行くところまでが冒頭。ロボットたちがけなげ。
スーパーマンのことを研究しつくし、ウルトラマン(!)とエンジニアを使って何度も倒していく悪役ルーサーが憎たらしい。
彼の陰謀もあって(というか結局スーパーマンの親父のせいで)スーパーマンが人間の敵として扱われていく。
人間らしい弱さも見せるスーパーマン。
ボロボロになっていき、捕えられたスーパーマンを助けたのは…
しかし予告にもなかったあの連中が出てくるとはびっくり。あとなんでクラークケントがスーパーマンだとばれないのかの理由がわかった。
ジェームズ・ガン監督らしく隙あらば笑いを入れてくるのもよかった。
泣けるシーンもあり。子供が旗を立てるシーンは号泣していた。最後のほうの両親の映像のシーンも。
しかし何と言ってもスーパー犬のクリプト。クリプトひどすぎないか、と思ったシーン(ミスター・テリフィックの飛んでいる球形デバイスをおもちゃだと思って噛んで壊す )もちゃんと伏線だった。
しかも本来の飼い主が誰だったのかが最後にわかって驚く。この人も大概ひどい。
その最後の人の映画が次に公開、ということで楽しみ。
・IEEE Microwave Magazineで地上監視レーダ解説など
https://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=6668
・Microwave Journalでミリ波AiPのOTA測定解説など
https://www.microwavejournal.com/publications/1
・5G Americasが5G Advancedホワイトペーパー発行
・TDKのAI 微細欠陥検出edgeRX Vision
TDK、AI で製品の微細な欠陥を検出する「edgeRX Vision」
・IEEE Trans. on THz の今月号発行
https://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=5503871
ここ数日、自宅で待機していないといけない状況になって、暇なのでXのポストをぼっーと見ていた。
何がとはいわないがひどい…7/20までは仕方ない(いやそれ以降が大変なのか)。
ポストの数々が逆正弦法則に見えてきている。もうちょっとガウス分布寄りでもいいんじゃないのかとか。
文句を言っても仕方がないのでJulia言語でモンテカルロシミュレーションをすることにした。
ソースはこれ。
using Random
using Plots
using Printf
n = 10000
anim = Animation()
for k in 1:6
m = 10^k
h1 = zeros(m)
h2 = zeros(m)
for i in 1:m
r = cumsum(rand(-1:2:1, n))
h1[i] = count(r .>= 0)/n
h2[i] = r[n]
end
plt1 = histogram(h1, bins=range(0, 1, step=0.01), normed=true, title = "Ratio of positive time, m = $(@sprintf("%d", m))", label="", xlabel="x", ylabel="p", size = (600, 600))
plt2 = histogram(h2, bins=range(-400, 400, step=10),normed=true, title = "Final positon, m = $(@sprintf("%d", m))", label="", xlabel="x", ylabel="p", size = (600, 600))
plt = plot(plt1, plt2, size = (1200, 600))
frame(anim, plt)
end
gif(anim, "test.gif", fps = 1)
|
±1を取るランダムウォークをn回繰り返し、正の時間にいる確率と、最終的な位置を試行回数mを変えてプロットしている。
結果はこちら。
前回の第一弾も面白かったので第二弾も買ってきた。
アマゾンリンク:https://amzn.to/3U7YCNd
内容は
というもの。
量子情報は物性、素粒子・宇宙に並んで量子力学応用で欠かせないものになってると実感する。
学部生のときちょっと量子光学やっていたのでいまこんな感じなのかとしみじみ。
そして量子異常もなんか計算したことあるぞと懐かしい。
その他、量子鍵配送、LDPC符号、弱値、量子チェシャ猫、dS/CFTなど面白い話もたくさんあってよかった。
・ 2025年7月12日 Pythonの高周波ライブラリscikit-rfがv1.8.0に
https://github.com/scikit-rf/scikit-rf
・SamsungがGalaxy Z Fold7など発表
・QualcommがSnapdragon 8 Eliteが使われていると発表
・NGMNが基地局アンテナの推奨事項をまとめる
・STMicroとMetalenzがメタサーフェス光学のライセンス締結
STMicroelectronics and Metalenz Sign a New License Agreement to Accelerate Metasurface Optics Adoption
暗号は昔、結城浩さんの暗号技術入門を読んだが、そこから全然アップデートしてないので読んでみた。
こういうのも作ったし。
アマゾンリンク:https://amzn.to/4nBlzpw
内容はとても多岐にわたっていて、セキュリティの考え方から上杉暗号、シーザー暗号、たぬき暗号!などから始まり(エニグマを模したコードまで)、RSA、AES、そして楕円曲線暗号についてはかなりの紙面を割いて最初の考え方からコード、実際にラズパイpico 2 wで動かすところまで乗っていて面白かった。
こんなにコンピュータの雑誌で楕円曲線が書かれているのを見たのは初めて。
それ以外にも形式検証ツールや耐量子暗号、関数型暗号、Y-00暗号と話題が豊富。TLSの実装まで。
これでだいぶ暗号についてはアップデートした気がする。
・NordicとSercommのセルラーIoTモジュール
・iFixitがFairphone 6を分解、スコアは10/10
ポゴピン接続が多いのはなるほど。
・RCR wireless newsのウェビナー2件(6GとIndustry4.0)
https://content.rcrwireless.com/webinar-6g-standards-spectrum-use-cases
https://content.rcrwireless.com/powering-logistics-4.0-webinar
・SEMCOが高耐圧C0G MLCCを車載急速充電に提案
今回はGray-Scott方程式を計算。2次元だと動物の模様のようなものができて面白いが今回は1次元でやってみよう。
∂u/∂t=u²v-(F+k)u+Du∂²u/∂x²
∂v/∂t=-u²v+F(1-v)+Dv∂²v/∂x²
コードはこんな感じ。
|
using Plots
using Printf
function main()
n = 200 #空間分割数
m = 2000000 #時間分割数
#u, vの初期化
u = zeros(Float64, n + 6)
v = zeros(Float64, n + 6)
ud = zeros(Float64, n + 6)
vd = zeros(Float64, n + 6)
#物理パラメータ
xmax = 1.6
xmin = 0.0
t = 0.0
du = 0.00001
dv = 0.00002
Fc = 0.04
kc = 0.06075
dt = 0.01
dx = (xmax - xmin) / (n - 3)
x = zeros(Float64, n + 6)
#表示用
results = []
ndiv = 2000
#8次のルンゲクッタ法の係数
a = zeros(Float64, 13)
b = zeros(Float64, 13, 13)
c = zeros(Float64, 13)
ku = zeros(Float64, n, 13)
kv = zeros(Float64, n, 13)
a[1] = 0.0
a[2] = 2.0 / 27.0
a[3] = 1.0 / 9.0
a[4] = 1.0 / 6.0
a[5] = 5.0 / 12.0
a[6] = 0.5
a[7] = 5.0 / 6.0
a[8] = 1.0 / 6.0
a[9] = 2.0 / 3.0
a[10] = 1.0 / 3.0
a[11] = 1.0
a[12] = 0.0
a[13] = 1
b[2, 1] = 2.0 / 27.0
b[3, 1] = 1.0 / 36
b[3, 2] = 1.0 / 12.0
b[4, 1] = 1.0 / 24.0
b[4, 3] = 1.0 / 8.0
b[5, 1] = 5.0 / 12.0
b[5, 3] = -25.0 / 16.0
b[5, 4] = 25.0 / 16.0
b[6, 1] = 1.0 / 20.0
b[6, 4] = 1.0 / 4.0
b[6, 5] = 1.0 / 5.0
b[7, 1] = -25.0 / 108.0
b[7, 4] = 125.0 / 108.0
b[7, 5] = -65.0 / 27.0
b[7, 6] = 125.0 / 54.0
b[8, 1] = 31.0 / 300.0
b[8, 5] = 61.0 / 225.0
b[8, 6] = -2.0 / 9.0
b[8, 7] = 13.0 / 900.0
b[9, 1] = 2.0
b[9, 4] = -53.0 / 6.0
b[9, 5] = 704.0 / 45.0
b[9, 6] = -107.0 / 9.0
b[9, 7] = 67.0 / 90.0
b[9, 8] = 3.0
b[10, 1] = -91.0 / 108.0
b[10, 4] = 23.0 / 108.0
b[10, 5] = -976.0 / 135.0
b[10, 6] = 311.0 / 54.0
b[10, 7] = -19.0 / 60.0
b[10, 8] = 17.0 / 6.0
b[10, 9] = -1.0 / 12.0
b[11, 1] = 2383.0 / 4100.0
b[11, 4] = -341.0 / 164.0
b[11, 5] = 4496.0 / 1025.0
b[11, 6] = -301.0 / 82.0
b[11, 7] = 2133.0 / 4100.0
b[11, 8] = 45.0 / 82.0
b[11, 9] = 45.0 / 164.0
b[11, 10] = 18.0 / 41.0
b[12, 1] = 3.0 / 205.0
b[12, 6] = -6.0 / 41.0
b[12, 7] = -3.0 / 205.0
b[12, 8] = -3.0 / 41.0
b[12, 9] = 3.0 / 41.0
b[12, 10] = 6.0 / 41.0
b[13, 1] = -1777.0 / 4100.0
b[13, 4] = -341.0 / 164.0
b[13, 5] = 4496.0 / 1025.0
b[13, 6] = -289.0 / 82.0
b[13, 7] = 2193.0 / 4100.0
b[13, 8] = 51.0 / 82.0
b[13, 9] = 33.0 / 164.0
b[13, 10] = 12.0 / 41.0
b[13, 12] = 1.0
c[6] = 34.0 / 105.0
c[7] = 9.0 / 35.0
c[8] = 9.0 / 35.0
c[9] = 9.0 / 280.0
c[10] = 9.0 / 280.0
c[12] = 41.0 / 840.0
c[13] = 41.0 / 840.0
#初期値
for i in 1:(n + 6)
x[i] = xmin + (i - 3) * dx
end
for i in 4:(n + 3)
u[i] = exp(-(x[i] - xmax / 2.0) ^ 2 * 1000.0)
v[i] = 1.0 - u[i]
end
for i in 1:m
# 8次のルンゲクッタ法計算
@inbounds for ii in 4:(n + 3)
ku[ii - 3, 1] = f(ii, t + dt, u, v, du, dv, Fc, kc, dx, n) * dt
kv[ii - 3, 1] = g(ii, t + dt, u, v, du, dv, Fc, kc, dx, n) * dt
end
@inbounds for j in 2:13
@inbounds @simd for ii in 4:(n + 3)
ud[ii] = u[ii]
vd[ii] = v[ii]
end
@inbounds for k in 1:(j - 1)
@inbounds @simd for ii in 2:(n + 1)
ud[ii] = ud[ii] + b[j, k] * ku[ii - 3, k]
vd[ii] = vd[ii] + b[j, k] * kv[ii - 3, k]
end
end
@inbounds for ii in 4:(n + 3)
ku[ii - 3, j] = f(ii, t + a[j] * dt, ud, vd, du, dv, Fc, kc, dx, n) * dt
kv[ii - 3, j] = g(ii, t + a[j] * dt, ud, vd, du, dv, Fc, kc, dx, n) * dt
end
end
@inbounds @simd for j in 1:13
for ii in 2:(n + 1)
u[ii] = u[ii] + c[j] * ku[ii - 3, j]
v[ii] = v[ii] + c[j] * kv[ii - 3, j]
end
end
t = t + dt
# ndivステップごとに結果(u)を配列に格納
if i % ndiv == 0
push!(results, copy(u))
end
end
# 計算結果をアニメーションで表示
anim = @animate for i in 1:length(results)
plot(x, results[i], ylim = (0.0, 0.5), linewidth = 4,title="Gray-Scott model", label="", xlabel="x", ylabel="u", size=(900,500))
end
gif(anim, "GrayScott.gif", fps = 30)
end
function f(i, t, u, v, du, dv, Fc, kc, dx, n)
u[1] = u[n + 1]
u[2] = u[n + 2]
u[3] = u[n + 3]
u[n + 4] = u[4]
u[n + 5] = u[5]
u[n + 6] = u[6]
d2 = (2 * u[i + 3] - 27.0 * u[i + 2] + 270.0 * u[i + 1] - 490.0 * u[i] + 270.0 * u[i - 1] - 27.0 * u[i - 2] + 2 * u[i - 3]) / (180.0 * dx * dx)
return du * d2 + u[i] * u[i] * v[i] - (Fc + kc) * u[i]
end
function g(i, t, u, v, du, dv, Fc, kc, dx, n)
v[1] = v[n + 1]
v[2] = v[n + 2]
v[3] = v[n + 3]
v[n + 4] = v[4]
v[n + 5] = v[5]
v[n + 6] = v[6]
d2 = (2 * v[i + 3] - 27.0 * v[i + 2] + 270.0 * v[i + 1] - 490.0 * v[i] + 270.0 * v[i - 1] - 27.0 * v[i - 2] + 2 * v[i - 3]) / (180.0 * dx * dx)
return dv * d2 - u[i] * u[i] * v[i] + Fc * (1.0 - v[i])
end
|
実行結果。パルスが次々分裂していくのが見える。
本当に久しぶりに島田荘司さんの御手洗潔シリーズを読んだ。
アマゾンリンク:https://amzn.to/4ev8t9o
あらすじは
「世界中で人気を博す、生きる伝説のバレリーナ・クレスパンが密室で殺された。
1977年10月、ニューヨークのバレエシアターで上演された「スカボロゥの祭り」で主役を務めたクレスパン。
警察の調べによると、彼女は2幕と3幕の間の休憩時間の最中に、専用の控室で撲殺されたという。
しかし3幕以降も舞台は続行された。
さらに観客たちは、最後までクレスパンの踊りを見ていた、と言っていてーー?」
というもの。もう最初からわけがわからない展開。
しかし20年後の1997年、いつの間にかスウェーデンの大学で脳を研究している御手洗潔(ネジ式ザゼツキーでそういう描写があったとか)が、その事件を調べている友人のジャーナリストに頼まれて推理をしていく。スウェーデン時代なので石岡さんは残念ながらでてきません。
そして3つの全く関係ない、アメリカで起きた間抜けな事件を聞いた御手洗さんは真相に迫っていく…
トリックの一つはある別の作家さんのものすごく有名な作品(映像化されるそうだ)を思い出し、もう一つは島田さんの別の作品を思い出したが、これはトリック云々よりそのクレスパンの人生や、それにかかわるユダヤ、ナチスなどなどの背景が重要で、また今の戦争についての批判もあり島田さんらしい。
長い作品だが面白くて一気に読めた。
・5G Americasが6Gに向けセンシングと通信ホワイトペーパー発行
・KYOCERA AVXが3dBハイブリッドカプラ発表
・TDKが車載薄膜インダクタ発表
・Nordicが1次電池向けPMIC発表
・ローデ・シュワルツの6GとAI/ML解説記事
・DOCSIS4.0で14Gbps達成
今回は蔵本・シバシンスキー方程式。時間・空間的にカオスを生じる最も簡単な偏微分方程式と言われている。金平糖の方程式と呼ばれているとかいないとか。
∂u/∂t+u∂u/∂x+∂²u/∂²+∂⁴/∂x⁴=0
これは何回もExcel VBAで計算しているのでそれを移植した。
空間方向は6次の差分(4階微分が出てくるので他の微分もそれに合わせた)でこんな感じで書ける。
1階: (-u(x-3dx)/9 + u(x-2dx)-5u(x-dx)+5u(x+dx) -u(x+2dx)+u(x+3dx)/9)/(20dx/3)
2階: (2u(x+3dx)-27u(x+2dx)+270u(x+dx)-490u(x)+270u(x-dx)-27u(x-2dx)+2u(x-3dx))/(180dx^2)
3階: (-u(x+3dx)+8u(x+2dx)-13u(x+dx)+13u(x-dx)-8u(x-2dx)+u(x-3dx))/(8dx^3)
4階: (-u(x+3dx)+12u(x+2dx)-39u(x+dx)+56u(x)-39u(x-dx)+12u(x-2dx)-u(x-3dx))/(6dx^4)
時間方向はRunge Kutta Felhbergの8次を使う。
コードはこんな感じ。
using Plots
using Random
using Printf
function main()
n = 200 #空間分割数
m = 400000 #時間分割数
u = zeros(Float64, n + 6)
ud = zeros(Float64, n + 6)
xmax = 50.0
xmin = 0.0
x = zeros(Float64, n + 6)
D = 0.15
t = 0.0
dt = 0.0005
dx = (xmax - xmin) / (n - 3)
MT = MersenneTwister()
Random.seed!(MT, 42)
#表示用
results = []
ndiv = 500
#8次のルンゲクッタ法の係数
a = zeros(Float64, 13)
b = zeros(Float64, 13, 13)
c = zeros(Float64, 13)
ku = zeros(Float64, n, 13)
a[1] = 0.0
a[2] = 2.0 / 27.0
a[3] = 1.0 / 9.0
a[4] = 1.0 / 6.0
a[5] = 5.0 / 12.0
a[6] = 0.5
a[7] = 5.0 / 6.0
a[8] = 1.0 / 6.0
a[9] = 2.0 / 3.0
a[10] = 1.0 / 3.0
a[11] = 1.0
a[12] = 0.0
a[13] = 1
b[2, 1] = 2.0 / 27.0
b[3, 1] = 1.0 / 36
b[3, 2] = 1.0 / 12.0
b[4, 1] = 1.0 / 24.0
b[4, 3] = 1.0 / 8.0
b[5, 1] = 5.0 / 12.0
b[5, 3] = -25.0 / 16.0
b[5, 4] = 25.0 / 16.0
b[6, 1] = 1.0 / 20.0
b[6, 4] = 1.0 / 4.0
b[6, 5] = 1.0 / 5.0
b[7, 1] = -25.0 / 108.0
b[7, 4] = 125.0 / 108.0
b[7, 5] = -65.0 / 27.0
b[7, 6] = 125.0 / 54.0
b[8, 1] = 31.0 / 300.0
b[8, 5] = 61.0 / 225.0
b[8, 6] = -2.0 / 9.0
b[8, 7] = 13.0 / 900.0
b[9, 1] = 2.0
b[9, 4] = -53.0 / 6.0
b[9, 5] = 704.0 / 45.0
b[9, 6] = -107.0 / 9.0
b[9, 7] = 67.0 / 90.0
b[9, 8] = 3.0
b[10, 1] = -91.0 / 108.0
b[10, 4] = 23.0 / 108.0
b[10, 5] = -976.0 / 135.0
b[10, 6] = 311.0 / 54.0
b[10, 7] = -19.0 / 60.0
b[10, 8] = 17.0 / 6.0
b[10, 9] = -1.0 / 12.0
b[11, 1] = 2383.0 / 4100.0
b[11, 4] = -341.0 / 164.0
b[11, 5] = 4496.0 / 1025.0
b[11, 6] = -301.0 / 82.0
b[11, 7] = 2133.0 / 4100.0
b[11, 8] = 45.0 / 82.0
b[11, 9] = 45.0 / 164.0
b[11, 10] = 18.0 / 41.0
b[12, 1] = 3.0 / 205.0
b[12, 6] = -6.0 / 41.0
b[12, 7] = -3.0 / 205.0
b[12, 8] = -3.0 / 41.0
b[12, 9] = 3.0 / 41.0
b[12, 10] = 6.0 / 41.0
b[13, 1] = -1777.0 / 4100.0
b[13, 4] = -341.0 / 164.0
b[13, 5] = 4496.0 / 1025.0
b[13, 6] = -289.0 / 82.0
b[13, 7] = 2193.0 / 4100.0
b[13, 8] = 51.0 / 82.0
b[13, 9] = 33.0 / 164.0
b[13, 10] = 12.0 / 41.0
b[13, 12] = 1.0
c[6] = 34.0 / 105.0
c[7] = 9.0 / 35.0
c[8] = 9.0 / 35.0
c[9] = 9.0 / 280.0
c[10] = 9.0 / 280.0
c[12] = 41.0 / 840.0
c[13] = 41.0 / 840.0
#初期値
for i in 1:(n + 6)
x[i] = xmin + (i - 3) * dx
end
for i in 4:(n + 3)
u[i] = 0.1 * (2.0 * rand(MT) - 1.0)
end
u[1] = u[n + 1]
u[2] = u[n + 2]
u[3] = u[n + 3]
u[n + 4] = u[4]
u[n + 5] = u[5]
u[n + 6] = u[6]
for i in 1:m
# 8次のルンゲクッタ法計算
@inbounds for ii in 4:(n + 3)
ku[ii - 3, 1] = fu(ii, t + dt, u, dx, n) * dt
end
@inbounds for j in 2:13
@inbounds @simd for ii in 4:(n + 3)
ud[ii] = u[ii]
end
@inbounds for k in 1:(j - 1)
@inbounds @simd for ii in 4:(n + 3)
ud[ii] = ud[ii] + b[j, k] * ku[ii - 3, k]
end
end
@inbounds for ii in 4:(n + 3)
ku[ii - 3, j] = fu(ii, t + a[j] * dt, ud, dx, n) * dt
end
end
@inbounds @simd for j in 1:13
for ii in 4:(n + 3)
u[ii] = u[ii] + c[j] * ku[ii - 3, j]
end
end
t = t + dt
# ndivステップごとに結果を配列に格納
if i % ndiv == 0
push!(results, copy(u))
end
end
# 計算結果をアニメーションで表示
anim = @animate for i in 1:length(results)
plot(x, results[i], ylim = (-3, 3), linewidth = 3,title="Kuramoto Sivashinsky equation", label="", xlabel="x", ylabel="u", size=(900,500))
end
gif(anim, "Kuramoto_Sivashinsky.gif", fps = 30)
end
function fu(i, t, u, dx, n)
u[1] = u[n + 1]
u[2] = u[n + 2]
u[3] = u[n + 3]
u[n + 4] = u[4]
u[n + 5] = u[5]
u[n + 6] = u[6]
d1 = (u[i + 3] / 9.0 - u[i + 2] + 5.0 * u[i + 1] - 5.0 * u[i - 1] + u[i - 2] - u[i - 3] / 9.0) / (20.0 * dx / 3.0)
d2 = (2.0 * u[i + 3] - 27.0 * u[i + 2] + 270.0 * u[i + 1] - 490.0 * u[i] + 270.0 * u[i - 1] - 27.0 * u[i - 2] + 2 * u[i - 3]) / (180.0 * dx * dx)
d4 = (-u[i + 3] + 12.0 * u[i + 2] - 39.0 * u[i + 1] + 56.0 * u[i] - 39.0 * u[i - 1] + 12.0 * u[i - 2] - u[i - 3]) / (6.0 * dx * dx * dx * dx)
return -u[i] * d1 - d2 - d4
end
|
main()で実行させるとこうなる。
全く予想できない動きをしている。
« 2025年6月 | トップページ | 2025年8月 »
最近のコメント