・Pythonの高周波用ライブラリ scikit-rfを使う
・Visual C#で数値計算ライブラリ Math.NET numericsを使う(Visual Basic版もあり)
・高周波エンジニアのためのAI・機械学習入門
・JavaScriptの数値計算ライブラリmath.jsを使う
・カシオの高精度計算サイトに投稿した自作式一覧
おまけ
円の弧長,弦長,矢高,半径のどれか2つを与えて残りを計算(改善版)
・Pythonの高周波用ライブラリ scikit-rfを使う
・Visual C#で数値計算ライブラリ Math.NET numericsを使う(Visual Basic版もあり)
・高周波エンジニアのためのAI・機械学習入門
・JavaScriptの数値計算ライブラリmath.jsを使う
・カシオの高精度計算サイトに投稿した自作式一覧
おまけ
円の弧長,弦長,矢高,半径のどれか2つを与えて残りを計算(改善版)
本エグゼクティブ・サマリーは、2026年4月12日から4月19日までの期間における無線周波数(RF)技術の動向および主要なハードウェア開発に関するハイレベルな分析を提供します。
3GPPおよびIEEEは、5G-Advancedから初期の6Gフレームワークへの移行において重要なマイルストーンに到達しました。
半導体リーダー各社は、AI主導のRF最適化を重点に置いた第1世代のリリース19対応ハードウェアを発表しています。
2026年春のフラッグシップ・サイクルの最新の分解調査により、熱管理とコンポーネント調達における大きな変化が明らかになりました。
通信規格は、単純なピーク速度よりも、高密度環境における信頼性を優先するように進化しています。
Qwen3.6が公開されていた。
Qwen3.6-35B-A3B: Agentic Coding Power, Now Open to All
Ollamaでも早速使えるようになっている。
https://ollama.com/library/qwen3.6
そこでいつもの質問をしてみた。どちらも正しいし、答え方が一番今までのローカルLLMで賢い気がする。Gemma4が今まで一番と思っていたけど入れ替わった。
問:
電子レンジの動作原理となぜ2.45GHzが使われているかを教えてください。特に水分子の共振周波数とも関連づけて説明してください。
答え
電子レンジの動作原理と2.45GHz採用の理由について、よくある誤解を踏まえつつ、物理的・工学的な観点から整理して解説します。
電子レンジは食品内部から加熱しますが、その仕組みは「共鳴」ではなく**誘電加熱(dielectric heating)**です。
よく「電子レンジは水分子の共鳴周波数に合わせたから」と説明されますが、これは科学的に正確ではありません。
| 状態 | 主な回転吸収帯 | 備考 |
| 気体・単量体水分子 | 約22.2 GHz | 真空中の純回転遷移(ミクロな量子共鳴) |
| 液体水(室温) | 10〜20 GHz付近に広がり | 水素結合ネットワークにより共鳴幅が大幅に拡張 |
| 電子レンジ周波数 | 2.45 GHz | 吸収曲線の裾野側、ピークの約1/10程度の吸収率 |
液体の水分子は分子間相互作用で自由に回転できないため、「特定の周波数で激しく共鳴して熱くなる」という現象は起きません。むしろ2.45GHzは、水の吸収が「まだ十分でないが、許容範囲内」の領域に位置しています。
2.45GHzの採用は、水分子の共鳴を利用したのではなく、以下の実用的トレードオフから最適化された結果です。
学術的に正確な記述を求む場合は、J. D. Jackson『電磁論』やP. Debye『極性分子』、あるいはIEC 60335-2-25(家庭用電子レンジ安全規格)の関連解説が参考になります。必要に応じて物理モデルや周波数特性のグラフも提示可能です。
問
隕石が大気圏に突入すると燃えてしまいますが、その原理を教えてください。
答え
隕石が大気圏突入時に「燃える」ように光る現象は、化学的な燃焼(酸化反応)ではなく、空気の急激な圧縮による物理的な加熱が主原因です。以下に原理を順に解説します。
隕石は大気圏に突入する際、毎秒11〜70kmという極超高速で移動します。この速度で空中を進むと、前方の空気が隕石に押されて圧縮され、強い衝撃波(ボウショック)が形成されます。圧縮された空気は体積が急激に減るため、温度が瞬間的に上昇します(断熱圧縮)。これにより衝撃波直後の空気温度は2,000〜4,000℃以上に達し、これが隕石を加熱・気化させる主因です。
「空気との摩擦で燃える」と説明されることが多いですが、航空力学のシミュレーションや実際の観測から、加熱の約80〜90%は空気の圧縮によるもの、摩擦は10〜20%程度であることがわかっています。摩擦だけでは説明できない点として:
高温となった空気中の分子(窒素・酸素など)がイオン化し、プラズマ状になります。このプラズマが発光し、私たちが目にする「流れ星」の正体です。隕石本体はむしろ表面が融解・気化して剥がれ落ちる(アブレーション)ため、内部は比較的低温に保たれることもあります。
地表まで到達する「隕石」が残るかどうかは、以下の条件で決まります:
| 要因 | 説明 |
|---|---|
| サイズ | 直径1m以上だと中心部まで熱が届かず、剥離熱も時間がかかるため生存確率が高い |
| 材質 | 鉄隕石は熱伝導率が高く耐熱性に優れる。石質隕石も硅酸塩の融解熱が大きい |
| 突入角 | 急角度(真下に近い)ほど大気との相互作用時間が短く、熱を逃がしやすい |
| 速度 | 速度が低下するほど圧縮加熱の強度が下がる(地球の重力で加速されるが、大気抵抗で減速 begins early) |
これらの条件が揃えば、内部が融解や熱分解に耐え抜き、地表に落下します。
隕石の発光・気化は「化学反応による燃焼」ではなく、
超高速度 → 前方空気の断熱圧縮 → 衝撃波・高温化 → 熱伝達・アブレーション → プラズマ発光 という一連の物理プロセスです。そのため、地球の大気こそが「自然のシールド」として、小型の天体を保護していると考えられています。
詳しくは航空力学の「ハイスピード流入加熱(Aerodynamic Heating)」や「メテオロイド・アブレーション理論」で研究が進められており、NASAやJAXAの公開資料でもこのメカニズムが標準的に解説されています。
以前JavaScriptの数値計算ライブラリmath.jsを使っていろいろやってみるシリーズをやっていた。
でExcelのVBAから乗換が進むと思っていたが、そうでもないOfficeスクリプト(文法はTypeScript)。外部ライブラリ読めないから使えないなとおもっていたが、実はOfficeスクリプトは外部APIが呼び出せる。
またmath.jsはwebサービスとして RESTful APIで呼び出せる。
じゃあ普通に使えそう、ということでやってみる。まずは行列演算。LU分解で一次方程式を解き、逆行列と行列式を求める。
コードはこんな感じで。
|
async function main(workbook: ExcelScript.Workbook) {
let range: number[][] = workbook.getSelectedRange().getValues() as number[][];
let row: number = workbook.getSelectedRange().getRowIndex();
let column: number = workbook.getSelectedRange().getColumnIndex();
const n: number = range.length;
let a: number[][] = Array(n);
let b: number[] = Array(n);
let x: number[][];
let aInv: number[][] = Array(n);
let det: number[][];
for (let i = 0; i < n; i++) {
a[i] = range[i].slice(0, n);
b[i] = range[i][n];
}
// 送信するJSONデータ
const data = {
"expr": [
"a = " + JSON.stringify(a),
"b = " + JSON.stringify(b),
"lusolve(lup(a), b)",
"inv(a)",
"det(a)"
],
"precision": 14
};
// APIへの送信
const response = await fetch('http://api.mathjs.org/v4/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
// レスポンスの処理
const result: JSONData = await response.json();
x = JSON.parse(result.result[2]);
workbook.getActiveWorksheet().getRangeByIndexes(row, column + n + 1, n, 1)
.setValues(x);
aInv = JSON.parse(result.result[3]);
workbook.getActiveWorksheet().getRangeByIndexes(row + n + 1, column, n, n)
.setValues(aInv);
det = JSON.parse(result.result[4]);
workbook.getActiveWorksheet().getRangeByIndexes(row + 2 * n + 2, column, 1, 1)
.setValues(det);
}
interface JSONData {
"result": string | string[] | null
"error": string | null
}
|
こんな感じで簡単に動いた。
・atisの3GPP Rel.20ウェビナー動画公開
・MWCバルセロナ2026でのGSMA Device Enablement Summit資料公開
https://content.rcrwireless.com/gsma-device-enablement-summit
・ハリファ大学が無線周波数AI言語モデルRF-GPT発表
arXiv
・レドームの解説
その他
TDK
Rohm
・AmazonがGlobalstarを買収
・GSMAが日本のデジタル化についてレポート
・Mini-Circuitsがケーブルアセンブリを動画で解説
・Kymetaが米国海軍研究局と衛星通信で契約
・PerasoがドローンIFF向け60GHzモジュール出荷
・SEMCOが1500V耐圧MLCC発表
その他
DNN、CNNと来て今回はTransformer。
コードはこんな感じ。
import os
os.environ["KERAS_BACKEND"] = "jax"
import keras
import jax
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
plt.rcParams['font.family'] = 'Noto Sans CJK JP'
# JAXの高速化
jax.config.update("jax_enable_x64", False)
jax.config.update("jax_disable_jit", False)
# mixed precision (JAX + Keras3対応)
keras.mixed_precision.set_global_policy("mixed_float16")
# ==========================
# データ読み込み
# ==========================
data_label = np.load("complex_tl_data.npz")
data = data_label["data"] # (N,200,5)
label = data_label["label"] # (N,2)
x_train, x_test, y_train, y_test = train_test_split(
data, label, test_size=0.3, random_state=0
)
# ==========================
# ラベルのスケーリング
# ==========================
scaler_y = StandardScaler()
y_train_f = scaler_y.fit_transform(y_train)
y_test_f = scaler_y.transform(y_test)
# ==========================
# Positional Encoding
# ==========================
def positional_encoding(seq_len, d_model):
pos = np.arange(seq_len)[:, np.newaxis]
i = np.arange(d_model)[np.newaxis, :]
angle_rates = 1 / np.power(10000, (2 * (i // 2)) / np.float32(d_model))
angle_rads = pos * angle_rates
pe = np.zeros((seq_len, d_model))
pe[:, 0::2] = np.sin(angle_rads[:, 0::2])
pe[:, 1::2] = np.cos(angle_rads[:, 1::2])
return keras.ops.convert_to_tensor(pe, dtype="float32")
# ==========================
# Transformer Encoder Block
# ==========================
def transformer_encoder(x, head_size, num_heads, ff_dim, dropout=0.1):
# Self Attention
attn_out = keras.layers.MultiHeadAttention(
num_heads=num_heads,
key_dim=head_size
)(x, x)
#attn_out = keras.layers.Dropout(dropout)(attn_out)
x = keras.layers.LayerNormalization(epsilon=1e-6)(x + attn_out)
# Feed Forwardネットワーク
ffn = keras.layers.Dense(ff_dim, activation="relu")(x)
ffn = keras.layers.Dense(x.shape[-1])(ffn)
#ffn = keras.layers.Dropout(dropout)(ffn)
x = keras.layers.LayerNormalization(epsilon=1e-6)(x + ffn)
return x
# ==========================
# モデル定義
# ==========================
seq_len = 200
feat_dim = 5
embed_dim = 64
inputs = keras.Input(shape=(seq_len, feat_dim))
# 入力を高次元に射影
x = keras.layers.Dense(embed_dim)(inputs)
# Positional Encodingを加算
pe = positional_encoding(seq_len, embed_dim)
x = x + pe
# Transformer ブロック
x = transformer_encoder(x, head_size=64, num_heads=4, ff_dim=128)
#x = transformer_encoder(x, head_size=64, num_heads=4, ff_dim=128)
# 時系列次元を集約
x = keras.layers.GlobalAveragePooling1D()(x)
# 全結合
x = keras.layers.Dense(128, activation="relu")(x)
outputs = keras.layers.Dense(2)(x)
model = keras.Model(inputs, outputs)
model.compile(
optimizer=keras.optimizers.Adam(learning_rate=1e-3),
loss="mean_squared_error"
)
model.summary()
# ==========================
# 学習
# ==========================
batch_size = 64
epochs = 500
keras.utils.set_random_seed(1)
history = model.fit(
x_train,
y_train_f,
batch_size=batch_size,
epochs=epochs,
validation_split=0.15,
)
# ==========================
# 予測
# ==========================
y_pred_f = model.predict(x_test)
y_pred = scaler_y.inverse_transform(y_pred_f)
metric = keras.metrics.R2Score()
metric.update_state(y_test, y_pred)
result = metric.result()
print(result)
error = np.abs((y_test - y_pred)/y_test*100)
print(error.mean(axis=0))
legend = ["Z0"]
fig, ax = plt.subplots(2, 2, figsize=(12,12))
maxrvalue = y_pred[:,0].max()
minrvalue = y_pred[:,0].min()
maxivalue = y_pred[:,1].max()
minivalue = y_pred[:,1].min()
ax[0, 0].scatter(y_pred[:,0], y_test[:,0], c="r", s=5)
ax[0, 0].plot([0,maxrvalue], [0,maxrvalue], "--", c="black")
ax[0, 0].set_xlabel("推定した値(実部)")
ax[0, 0].set_ylabel("実際の値(実部)")
ax[0, 0].set_xlim(minrvalue, maxrvalue)
ax[0, 0].set_ylim(minrvalue, maxrvalue)
ax[0, 0].grid()
ax[0, 0].legend([legend[0] + f" 平均誤差(実部){error.mean(axis=0)[0]:.2f}%"])
ax[1, 0].hist(error[:, 0], bins = 100)
ax[1, 0].set_xlabel("誤差[%](実部)")
ax[1, 0].set_ylabel("頻度")
ax[1, 0].grid()
ax[0, 1].scatter(y_pred[:,1], y_test[:,1], c="r", s=5)
ax[0, 1].plot([0,maxivalue], [0,maxivalue], "--", c="black")
ax[0, 1].set_xlabel("推定した値(虚部)")
ax[0, 1].set_ylabel("実際の値(虚部)")
ax[0, 1].set_xlim(minivalue, maxivalue)
ax[0, 1].set_ylim(minivalue, maxivalue)
ax[0, 1].grid()
ax[0, 1].legend([legend[0] + f" 平均誤差(虚部){error.mean(axis=0)[1]:.2f}%"])
ax[1, 1].hist(error[:, 1], bins = 100)
ax[1, 1].set_xlabel("誤差[%](虚部)")
ax[1, 1].set_ylabel("頻度")
ax[1, 1].grid()
fig.tight_layout()
plt.show()
|
結果はこちら。CNNと大体同じくらいになっている。時間は1.5倍くらいはかかる。
まあ今回もCNNを使うのが一番よさそうだ。
・Microwave Journalはアンプと発振器特集
https://www.microwavejournal.com/publications/1
・Signal Integrity Journalは100GHz越えのインターコネクトのAIを使うHFSSモデル化
https://www.signalintegrityjournal.com/latestissue 
・ローデ・シュワルツが潜水艦通信をUDT2026で発表
・Xiaomi Poco X8 Pro分解動画
atisの5Gポリシーレポート
京セラAVX
・IEEE Microwave Magazineは高周波エンジニア向け量子コンピュータ入門など
https://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=6668
・Antenna and Propagation Magazineはニューラルネット電磁界シミュレーションなど
https://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=74
・第106回ARFTG論文公開
https://ieeexplore.ieee.org/xpl/conhome/11474779/proceeding
・QorvoのSバンドスイッチトフィルターバンク
その他
Yageo
RCRwirelessNews
今回は常微分方程式を作ってもらおう。ソルバーはSciPyに入っているDormand & Princeのアダプティブ高次ルンゲクッタ法のdopri5とdop853を入れてもらう。だいぶGitHubを検索していたが何とかできた。VBAのクラスにインターフェースがあるのは知らなかった…
例として1変数の減衰関数を出してくれていたが、ここはローレンツ方程式の例を出してもらおう。
で完成。
実行。
コードはまとめて貼っておこう。
これで行列計算、FFT、常微分方程式がExcel VBAでできるようになってだいぶ使える感じ。
このブログでは人力で高周波・RFを集める「高周波・RFニュース」とGoogle AI Studioで作ったアプリで集める「RF Weekly Digest」の2種類を運用している。Gemma 4が出て、ローカルLLMでもOpenClawが結構使えるようになってているので、ここはOpenClaw+Ollama+Gemma 4:26bを使ったRF情報アシスタントを作ってみた。Ollama web searchを使って思っていたより速く集めてくれた。
結果:
本レポートは、過去7日間における無線周波数(RF)エコシステムの重要な進展をまとめたものであり、5G-Advancedの成熟への決定的なシフト、およびWi-Fi 8と6G FR3帯向けの初の具体的なハードウェアの登場を強調しています。
2026年第1四半期後半に発売されたSamsung Galaxy S26 Ultraの最新分析が、今週の技術的な分解調査コミュニティ(iFixit、TechInsights、Zack Nelson)で注目を集めました:
最近のコメント