在 WSL2 Ubuntu20.4 系統(tǒng)中安裝 Baltamatica 顯示成功, 準備運行時出現(xiàn) Inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_libc_early_init: Assertion `sym != NULL' failed! 錯誤.

請問這該怎么處理?謝謝!
寫了一個自適應 Simpson 求積公式的代碼, 運行過程中出現(xiàn)了 abs命令或者變量的類型發(fā)生變化導致,無法求值 的錯誤, 如圖所示

我寫的 adapsimp 的代碼如下
function [s, err] = adapsimp(func, a, b, tol) s = comsimp(func, a, b, 2); c = (a + b) / 2; s1 = comsimp(func, a, c, 2); s2 = comsimp(func, c, b, 2); s12 = s1 + s2; err = abs(s12 - s) / 15; if err < tol s = s12; else [s1, err1] = adapsimp(func, a, c, tol/2); [s2, err2] = adapsimp(func, c, b, tol/2); s = s1 + s2; err = err1 + err2; end end
里面用到了 comsimp 函數(shù), 是這樣寫的
function s = comsimp(func, a, b, n)
h = (b - a) / n;
s0 = func(a) + func(b);
s1 = 0; % summation of f(x_{2k-1})
s2 = 0; % summation of f(x_{2k})
for k = 1:n-1
x = a + k * h;
if rem(k , 2) == 0
s2 = s2 + func(x);
else
s1 = s1 + func(x);
end
end
s = h * (s0 + 4 * s1 + 2 * s2) / 3;
end這部分代碼在 octave 上運行是沒有問題的

用的版本是2.2.0最新版的.
使用 disp 函數(shù)給輸出增加說明的時候, 出現(xiàn)了順序上的錯誤. 比如使用下面一段代碼
for n = 1:3
disp("n 的值為")
n
end正常輸出應該是一句 "n 的值為" 和 n 的具體值交替輸出

但現(xiàn)在是先將n的值都輸出完了, 才輸出的disp語句里面的內(nèi)容

使用的是 Deepin 操作系統(tǒng), 版本為 2.1.1. 好像 Deepin 的安裝包還停留在 1 月份的沒更新.
對于數(shù)量級極大的一組數(shù)據(jù)
x = 0:0.1:1; y = [2, -2, -6, -42, -1806, -3.26344e+06, -1.06501e+13, -1.13424e+26, -1.28649e+52, -1.65507e+104, -2.73925e+208];
只要使用 plot(x, y) 繪制圖形, 軟件便會自動退出. 對于其他正常的數(shù)據(jù), 繪圖時正常的.
使用的是 Deepin 操作系統(tǒng), 版本為 2.1.1.
目前 Windows 平臺下 3.0.1 版的軟件是不可以在終端下使用而只能啟動圖形界面了嗎?
使用 mesh 函數(shù)繪制曲面圖形,報錯提示錯誤使用 mesh 函數(shù),Z 必須為矩陣,不能是標量或向量。
Deepin 系統(tǒng)版本為 2.1.1 上運行是沒有問題的,但在 Windows 11 系統(tǒng)版本為 3.0.3 上運行會出現(xiàn)上述錯誤。
clear;
clc;
% 空間步長
h = 0.01;
% 時間步長
tau = 0.01;
x = 0:h:1;
t = 0:tau:1;
% 剖分網(wǎng)絡
[X, T] = meshgrid(x, t);
% 解析解
Ut = exp(-X+T);
% 作圖
mesh(x, t, Ut)
title("擴散方程初邊值問題的精確解")
xlabel("x")
ylabel("t")另外,Deepin 的版本什么時候更新,半年前反饋的 Deepin 版本上的問題到現(xiàn)在還沒有修正。
操作系統(tǒng)為 Deepin20.9, 版本為開發(fā)者預覽版 Baltamatica_999-3.1.3-dev1.
在終端下啟動北太天元并使用繪圖函數(shù)會自動退出程序,提示需要先創(chuàng)建一個 QApplication 應用。

操作系統(tǒng)為 Deepin20.9, 版本為開發(fā)者預覽版 Baltamatica_999-3.1.3-dev1.
繪圖后點擊左上角導出圖片保存為png格式,提示導出圖片失敗。

使用 symbolic 插件提供的 sym 命令創(chuàng)建符號變量 x 后,工作區(qū)不顯示任何變量信息

使用 whos 命令查看發(fā)現(xiàn)只有 ans 這個變量,且類型識別為 extern. 將這個 ans 賦值給 x 之后,無論參與運算工作區(qū)都是不顯示任何信息的,也就是工作區(qū)無法識別 extern 這種類型的變量。

目前將所有公布過的正式版本都安裝嘗試了一遍,都是這種情況。
操作系統(tǒng)為 Deepin20.9, 安裝的版本為 baltamatica_999_3.5.0_dev0
繪制一個周期的正弦曲線, 得到的圖如下, 坐標軸上標記的點已經(jīng)超出了圖像的大小.

操作系統(tǒng)是 Deepin V23, 輸入法使用的是 fcitx5. 從 3.5.0-dev1 開始試驗, 到最新的 3.6.1-dev1, 使用通用版的 Linux 安裝包安裝后, 均無法在編輯器中切換中文輸入法輸入中文.
3.1.3-dev1_Deepin20.9 在 Deepin V23 上安裝能夠正常切換中英文.
IQA 插件默認使用的是 qwen2.5 模型,每次重新啟動軟件都需要重新使用 AIInit 初始化一下其他本地模型。建議增加修改默認模型的功能。
首先生成一個測試文件,第一行類似于表頭,2到4行每行存儲3個數(shù),用tab鍵分隔
fwid = fopen("test.txt", "w");
fprintf(fwid, "%s\t%s\t%s\n", "column_1", "column_1", "column_3");
fprintf(fwid, "%d\t%d\t%d\n", 1, 2, 3);
fprintf(fwid, "%d\t%d\t%d\n", 4, 5, 6);
fprintf(fwid, "%d\t%d\t%d\n", 7, 8, 9);
fclose(fwid);得到的文件共5行,第5行是一空行。下面以 fgetl 函數(shù)逐行讀取該文件。
方法一:
以 feof 函數(shù)作為 while 循環(huán)的判斷條件,依次讀取文件的每一行并顯示出來
frid = fopen("test.txt", "r");
fgetl(frid);
% 是否到達文件末尾 (EOF)
while ~feof(frid)
line = fgetl(frid);
disp(line);
end
fclose(frid);該方法在北太天元中除了顯示文件中的3行數(shù)字,還會顯示一個-1,這個-1是fgetl判斷到文件末尾后返回的。而在 MATLAB 中只顯示 3 行數(shù)字。


方法二:
考慮到方法一中 fgetl 函數(shù)返回了 -1 但 feof 條件沒有起作用,將 while 循環(huán)條件改為 true,循環(huán)內(nèi)部滿足 feof 條件 break 循環(huán)。
frid = fopen("test.txt", "r");
fgetl(frid);
while true
line = fgetl(frid);
% 如果到達文件末尾,則退出循環(huán)
if feof(frid)
break;
end
disp(line);
end
fclose(frid);該方法在北太天元中輸出符合預期,但在 MATLAB 中只輸出兩行數(shù)據(jù)


也就是說,在北太天元中,讀取了 7 8 9 三個數(shù)后,需要再讀取一行才到末尾 (EOF),所以讀取到的 -1 沒有 disp;而在 MATLAB 中,讀取了之后已經(jīng)到末尾,雖然讀取了這三個數(shù),就跳出循環(huán)不再顯示。代碼中的 if 判斷更換任意位置在北太天元中都將顯示 -1。
驗證:
手動逐行讀取文件進行驗證
frid = fopen("test.txt", "r");
fgetl(frid);
disp(feof(frid));
fgetl(frid);
disp(feof(frid));
fgetl(frid);
disp(feof(frid));
fgetl(frid);
disp(feof(frid));
fgetl(frid);
disp(feof(frid));
fclose(frid);在北太天元和 MATLAB 中輸出的結(jié)果分別是


測試文件共 5 行,前四行有內(nèi)容,第五行是空行,在 MATLAB 中,讀取完第四行就判斷為文件末尾,而在北太天元中,五行全部讀完才判斷是文件末尾。
無法讀取保存polyshape數(shù)據(jù)類型的mat數(shù)據(jù)文件
t_start = datetime(2025, 5, 21, 21, 00, 00); t_end = t_start + hours(1); t_step = minutes(1); t_start:t_step:t_end
運行報錯, 提示不支持冒號運算符

1. 首先,針對北太天元所使用的 Python,安裝 pyttsx3 文本轉(zhuǎn)語音引擎:
load_plugin("Python");
pipcmd("install pyttsx3 -i https://pypi.tuna.tsinghua.edu.cn/simple/");2. 使用如下函數(shù)初始化一個基于 pyttsx3 的 TTS 引擎并設置其參數(shù):
function [engine] = textToSpeech_pytts_init()
% 獲取 Python 根對象用于調(diào)用 Python 函數(shù)等
py = pyroot;
% 導入 pyttsx3 模塊
pyttsx3 = py.pyttsx3;
% 初始化 TTS 引擎
engine = pyttsx3.init();
% 設置語音屬性 (可選)
voices = engine.getProperty('voices');
% voices 是一個 py.list 對象
% 目前北太天元無法直接使用 length 獲取 py.list 的長度
% 只能暫時使用 Python 中的 len 來代替
for i = 1:py.len(voices)
% 同樣, 北太天元中的 frompy 函數(shù)無法將 py.list 類型的 voices 轉(zhuǎn)化為內(nèi)置的數(shù)組
% 所以只能通過 pygetitem 函數(shù)來獲取每一個元素
voice = pygetitem(voices, i-1);
if contains(string(voice.name), 'Chinese') % 查找支持中文的語音
engine.setProperty('voice', voice.id);
break
end
if contains(string(voice.name), 'English') % 查找支持英文的語音
engine.setProperty('voice', voice.id);
break;
end
end
% 設置語速 (可選)
engine.setProperty('rate', 150); % 默認值為 200
% 設置音量 (可選)
engine.setProperty('volume', 0.8); % 范圍是 0.0 到 1.0
end3. 初始化引擎,并傳給引擎文本,讓引擎朗讀,或者保存音頻:
% 初始化 TTS 引擎 engine = textToSpeech_pytts_init(); % 設置要說的文本 text = "你好,我在北太天元中調(diào)用 Python 文本轉(zhuǎn)語音引擎!"; engine.say(text); % 保存為 WAV 文件 engine.save_to_file(text, "output.wav"); % 運行并等待語音完成 engine.runAndWait(); engine.stop()
這樣便可以聽見引擎朗讀的聲音,也可以在本地找到保存的 output.wav 文件。
本示例中的 textToSpeech_pytts_init() 函數(shù)參考 大預言模型(LLM)賦能具身智能中的人機交互 中 Python 模型集成一節(jié),并將無法在北太天元中運行的部分進行了修改。
本示例也參考了 Python使用總結(jié)之Python文本轉(zhuǎn)語音引擎:pyttsx3完全指南 如何使用 pyttsx3 庫。
對于這樣一組數(shù)據(jù), 每一列數(shù)據(jù)長度保持一致, 不足的采用空格補充; 數(shù)據(jù)與數(shù)據(jù)之間采用空格分隔:
13.52220 0.00 18.100 0 0.6310 3.8630 100.00 1.5106 24 666.0 20.20 131.42 13.33 23.10 4.89822 0.00 18.100 0 0.6310 4.9700 100.00 1.3325 24 666.0 20.20 375.52 3.26 50.00 5.66998 0.00 18.100 1 0.6310 6.6830 96.80 1.3567 24 666.0 20.20 375.33 3.73 50.00 6.53876 0.00 18.100 1 0.6310 7.0160 97.50 1.2024 24 666.0 20.20 392.05 2.96 50.00 9.23230 0.00 18.100 0 0.6310 6.2160 100.00 1.1691 24 666.0 20.20 366.15 9.53 50.00 8.26725 0.00 18.100 1 0.6680 5.8750 89.60 1.1296 24 666.0 20.20 347.88 8.88 50.00 11.10810 0.00 18.100 0 0.6680 4.9060 100.00 1.1742 24 666.0 20.20 396.90 34.77 13.80 18.49820 0.00 18.100 0 0.6680 4.1380 100.00 1.1370 24 666.0 20.20 396.90 37.97 13.80 19.60910 0.00 18.100 0 0.6710 7.3130 97.90 1.3163 24 666.0 20.20 396.90 13.44 15.00 15.28800 0.00 18.100 0 0.6710 6.6490 93.30 1.3449 24 666.0 20.20 363.02 23.24 13.90
使用內(nèi)置的 readmatrix 讀取, 會出現(xiàn)以下兩個問題:
1. 每行行首可能會出現(xiàn)空格, readmatrix 會得到第一個數(shù)據(jù)為 NaN;
2. 數(shù)據(jù)與數(shù)據(jù)之間雖然都是空格, 但空格數(shù)量不統(tǒng)一, 有1個空格、2個空格和3個空格幾種情況。
所以使用 readmatrix 得到的數(shù)據(jù)列數(shù)不匹配,多分隔出來的數(shù)據(jù)全部都是 NaN.
對于上述兩個問題,MATLAB 中的 readmatrix 函數(shù)是可以輸入 "ConsecutiveDelimitersRule", "join" 把重復的分隔符合并成一個分隔符, "LeadingDelimitersRule", "ignore" 參數(shù)忽略行首的分隔符.
contains(str, pat) 函數(shù)用于判斷字符串 str 中是否包含 pat 子串,但在 Windows 4.2.1 版本中,contains 像是被一個用于幾何包含的函數(shù)給覆蓋了


經(jīng)過測試,該函數(shù)在 Linux 4.2.1 版本和 Windows 4.2.0 版本中都能正常運行。
Lévy 飛行是基于 Lévy 分布的隨機搜索過程. Lévy 飛行是一種隨機行走, 其中步長服從 Lévy 分布. 它通過模擬自然界中動物在尋找食物或遷徙過程中, 采取的長距離跳躍和短距離滑行相結(jié)合的移動模式. 其核心特點是步長的概率分布為重尾分布, 即存在相對較高的概率出現(xiàn)大跨步, 這使得動物能夠在廣闊的范圍內(nèi)進行搜索.
與傳統(tǒng)的隨機游走策略相比, Lévy 飛行策略具有以下優(yōu)勢:
* 提高搜索效率: 通過長距離跳躍, Lévy 飛行策略能夠快速擴大搜索范圍, 提高搜索效率;
* 跳出局部最優(yōu)解: Lévy 飛行策略在搜索過程中偶爾會出現(xiàn)大跨步, 有助于跳出局部最優(yōu)解, 尋找全局最優(yōu)解;
* 適應性強: Lévy 飛行策略適用于各種復雜環(huán)境, 能夠有效應對路徑規(guī)劃中的不確定性.
因此, Lévy 飛行算法作為一種高效的優(yōu)化路徑規(guī)劃方法, 目前被廣泛應用于智能優(yōu)化算法中, 如麻雀搜索算法、鯨魚優(yōu)化算法、粒子群優(yōu)化算法、蜣螂優(yōu)化算法等等.
Mantegna 算法是 Mantegna 于 1994 年提出的用于模擬對稱 Lévy 穩(wěn)定過程. 根據(jù) Mantegna 算法, 可以通過生成兩個正態(tài)分布的數(shù)據(jù)計算得到服從 Lévy 分布的數(shù)據(jù). 采用北太天元數(shù)值計算通用軟件來實現(xiàn)該算法的代碼如下:
function [s] = levyrnd(beta, m, n) %LEVYRND - Mantegna 算法生成對稱 Lévy 穩(wěn)定分布隨機數(shù)組. % % 用法: % levyrng(beta); - 生成單個服從參數(shù)為 beta 的 Lévy 分布數(shù)據(jù); % levyrng(beta, m); - 生成 m x m 維服從參數(shù)為 beta 的 Lévy 分布矩陣; % levyrng(beta, m, n); - 生成 m x n 維服從參數(shù)為 beta 的 Lévy 分布矩陣. % % 示例: % >> rng(1234); % >> levyrnd(1.8) % 0.5299 % >> levyrnd(0.5, 2) % 0.7074 -0.0853 % -2.1705 -219.2879 % >> levyrnd(1.1, 2, 3) % -0.6688 0.2140 -1.8900 % -3.4959 0.2340 -24.1111 % narginchk(1, 3); if nargin == 1 m = 1; n = 1; elseif nargin == 2 n = m; end % 計算 u ~ N(0, sigma^2) 的方差 num = gamma(1 + beta) * sin(pi * beta / 2); den = gamma((1 + beta)/2) * beta * 2^((beta - 1)/2); sigma = (num / den)^(1/beta); % 生成隨機變量 u 和 v, v ~ N(0, 1). u = normrnd(0, sigma, m, n); v = normrnd(0, 1, m, n); % 生成 Lévy 分布數(shù)據(jù) s = u ./ abs(v).^(1/beta); end
利用 Mantegna 算法, 可以生成一系列的服從 Lévy 分布的隨機步長, 模擬 Lévy 飛行. 值得注意的是, 隨機游走是在任意維度空間中, 一個點隨機地向任意方向前進任意長度的距離, 然后不斷的重復.
我們模擬從原點出發(fā), 隨機向任意方向前進步長為 $s$ 的 Lévy 飛行. 模擬過程如下:
clear;
clc;
% Lévy 分布參數(shù)
beta = 1.5;
% Lévy 飛行步數(shù)
n = 1000;
% 生成隨機方向
angles = 2 * pi * rand(n, 1);
% 初始化數(shù)據(jù)
x = zeros(n + 1, 1);
y = zeros(n + 1, 1);
% 生成 Lévy 步長
s = levyrnd(beta, n, 1);
% 循環(huán)游走
for i = 1:n
x(i + 1) = x(i) + cos(angles(i)) * s(i);
y(i + 1) = y(i) + sin(angles(i)) * s(i);
end
% 繪制 Lévy 飛行隨機游走
plot(x, y);
title("Levy 飛行策略");
xlabel("x");
ylabel("y");得到的結(jié)果如圖所示:

對于 MATLAB 保存的 MAT 格式數(shù)據(jù)文件,在北太天元中只能讀取 v6 和 v7 兩個版本的數(shù)據(jù)文件,對于 v4 和 v7.3 兩個版本的數(shù)據(jù)文件,在北太天元中均提示數(shù)據(jù)文件為空。
1. 對于可選位置參數(shù) (addOptional) 和可選參數(shù) (addParameter) 共同存在的情形, 仍不能正確的解析, 示例在原來的例子中加入 addRequired 如下:
function findArea(varargin)
p = inputParser;
p = addRequired(p, 'width', @(x) isnummeric(x) && isscalar(x) && (x > 0));
p = addOptional(p, 'height', 1);
p = addParameter(p, 'units', 'm');
p = addParameter(p, 'shape', 'square');
p = parse(p, varargin{:});
width = p.Results.width
height = p.Results.height
units = p.Results.units
shape = p.Results.shape
endfindArea(2, 3, "units", "cm") 現(xiàn)在可以正確解析了. 但是如果可選位置參數(shù)輸入不足時, 如 findArea(2, "units", "cm") 就不能正常解析了.
在 inputParser 類的代碼第 152 行定義的當前參數(shù)位置指針 pos = 1, 有一個必須參數(shù)和一個可選位置參數(shù), pos 經(jīng)過兩次加一得到 pos = 3, 此時解析參數(shù)的時候, 剩余可選參數(shù)為 varargin(3:end) = "cm", "units" 雖然沒有像之前的版本被賦值給 "height", 但也被吞掉消失. 只剩下 "units" 不是成對出現(xiàn)導致解析可選參數(shù)出錯.
2. 在添加參數(shù)的時候, checkArgs(list, value, validator) 函數(shù)是通過 ismember 函數(shù)來判斷是否存在該參數(shù)名的.
ismember 只能判斷字符元胞數(shù)組, 那么在添加參數(shù)的時候只能使用字符數(shù)組, 如上面的示例 p = addOptional(p, 'width', 1); 原本使用的字符串在使用的時候就全部報錯.
這個問題只需要在 inputParser 中添加幾個 char 全部轉(zhuǎn)化成字符數(shù)組即可, 而不用關心用戶輸入的是字符還是字符串.
分別是 addParameter 函數(shù) 101, 102 行 paramName 外面添加 char(), addOptional 函數(shù) 112, 113 行 paramName 外面添加 char(), addRequired 函數(shù) 123 行添加 char().
copyfile(source, destination) 用于復制文件. 在使用過程中存在以下幾個問題
1. 如果 destination 不存在, 提示錯誤使用 copyfile 函數(shù), 文件 destination 不存在, 這是 Windows 和 Linux 均存在的問題.
2. 創(chuàng)建一個空文件 destination, 此時再調(diào)用 copyfile 復制文件, Windows 平臺可以成功復制, Linux 平臺報錯
cp: /opt/Baltamatica/lib/libattr.so.1: version `ATTR_1.3' not found (required by cp)
cp: /opt/Baltamatica/lib/libselinux.so.1: no version information available (required by cp)
cp: /opt/Baltamatica/lib/libselinux.so.1: no version information available (required by cp)
目前嘗試的解決方案, 將系統(tǒng)的 libattr.so.1 和 libselinux.so.1 文件鏈接到 /opt/Baltamatica/lib 中
sudo mv /opt/Baltamatica/lib/libattr.so.1 /opt/Baltamatica/lib/libattr.so.1.bak
sudo mv /opt/Baltamatica/lib/libselinux.so.1 /opt/Baltamatica/lib/libselinux.so.1.bak
sudo ln -s /usr/lib/x86_64-linux-gnu/libattr.so.1 /opt/Baltamatica/lib/libattr.so.1
sudo ln -s /usr/lib/x86_64-linux-gnu/libselinux.so.1 /opt/Baltamatica/lib/libselinux.so.1
重新運行北太天元后可以復制已存在的文件.
1. Python 中的復數(shù)如何和北太天元中的復數(shù)相互轉(zhuǎn)化. 這一點在 MATLAB 中也是沒有相應的函數(shù)將 Python 的復數(shù)轉(zhuǎn)化為 MATLAB 函數(shù)的復數(shù), MATLAB 的機制是只要對 Python 的復數(shù)做了運算, 就自動轉(zhuǎn)化為 MATLAB 的復數(shù), 如 py.complex(1, 1) + 0 得到的就是 MATLAB 中的復數(shù) 1.0 + 1.0i.
2. 創(chuàng)建復數(shù)符號變量, sym(1+i) 不可行, 可行的兩種方式, 直接使用符號虛數(shù)單位 sp.I 如 1 + sp.I, 另一種使用簡化函數(shù) sp.simplify() 或者封裝好的 symsimplify(), 如 symsimplify(1+i);
3. SymPy 插件創(chuàng)建的符號變量不支持絕對值函數(shù) abs(sym('x')).
4. SymPy 插件在調(diào)用 lambdify 函數(shù)時報錯, 'NoneType' object has no attribute 'f_locals'. 示例如下:
load_plugin SymPy
sp = sympy_sp;
x = sym('x');
y = sin(x);
f = sp.lambdify(x, y)