发帖
日期

SymPy工具箱更新说明

本次更新针对符号计算部分功能进行说明与修复,补充说明符号函数定义,微分方程求解,修复 subs 多字符替换,完善 series 和 int 的语法等功能。更新方式:1.完成2.0预览版中的更新操作2.下载下面的文件,并将里面的代码和文件夹覆盖复制到北太天元安装目录的/plugins/SymPy/scripts下scripts.zip以下为具体更新内容、旧版问题、新版用法及示例:一、补充符号函数定义修复问题原说明文档中仅介绍了 syms 支持定义基础符号变量,无法直接创建符号函数(如 f (x)、g (x,y))。更正说明Syms 支持直接创建符号函数,可一键定义单 / 多变量函数;支持先定义变量再定义函数 或 变量 + 函数同步定义。示例

% 方式1:先定义变量,再定义函数
syms x  % 先创建变量x
syms f(x)  % 定义单变量函数f(x)
syms 'g(x)'  % 或使用字符串形式

% 方式2:变量+函数同步定义
syms x f(x)   % 定义单个变量
syms t w z(w,t) % 定义多个变量
注意:使用方式1时一定要先定义自变量,然后定义符号函数,否则命令会未生效但不进行报错。二、补充常微分方程求解(dsolve)函数介绍修复问题使用 dsolve 函数出现错误,本次修复了部分问题完善语法,并给出了注意事项。支持语法1.S = dsolve(eqn) :求解微分方程 eqn,其中 eqn 是符号方程。使用 diff 和 == 来表示微分方程。例如,diff(y,x) == y 表示方程 dy/dx = y。通过将 eqn 指定为由微分方程组中的方程组成的向量来求解该微分方程组。2.S = dsolve(eqn,cond) 求解具有初始条件或边界条件 cond 的 eqn。3.S = dsolve(eqns,conds) 求解具有初始条件或边界条件 conds 的 方程组 eqns。注意:这里的 eqns 需要使用 horzcat 进行并置或者使用元胞数组, conds 仅支持使用元胞数组的形式。使用示例
% 求解一阶微分方程
syms a t f(t)
eqf = eq(diff(f, t), a*f);
disp(dsolve(eqf))
% 输出结果为: C1*exp(a*t)
% 加上初值条件:
disp(dsolve(eqf, eq(subs(f, t, 0), 5)))
% 输出结果为: 5*exp(a*t)
% 求解二阶微分方程:
eqf2 = eq(diff(f, t, 2), a*f);
disp(dsolve(eqf2))
% 输出结果为: C1*exp(-sqrt(a)*t) + C2*exp(sqrt(a)*t)
% 加上两个初值条件:
df = diff(f, t);
conds = {eq(subs(f, t, 0), 0), eq(subs(df, t, 0), 1)};
disp(dsolve(eqf2, conds))
% 输出结果为:exp(sqrt(a)*t)/(2*sqrt(a)) - exp(-sqrt(a)*t)/(2*sqrt(a))
% 求解二元常微分方程组:
syms t y(t) z(t)
eq1 = diff(y,t)==z;
eq2 = diff(z,t)==-y;
eqs = {eq1,eq2};
s = dsolve(eqs);
% 此时会返回 cell 数组:
disp(s{1})
% 输出结果为: Eq(y(t), C1*sin(t) + C2*cos(t))  
disp(s{2})
% 输出结果为: Eq(z(t), C1*cos(t) - C2*sin(t))
三、修复 subs 多字符替换功能修复问题subs 支持多字符替换但是结果不对,应该是命令未生效所致。本次修复了该问题。使用示例
syms x y z % 定义符号变量
expr = x + 2*y + 3*z;

vars = horzcat(x,y,z);  % 使用horzcat将变量并置
syms a b
values = horzcat(1,a,b);

newexpr = subs(expr,vars,values);  % 使用变量替换
disp(newexpr)
% 修改前输出结果为 x + 2*y + 3*z  (似乎是未生效)
% 修改后输出结果为 2*a + 3*b + 1
四、series 语法功能完善修复问题函数series的语法使用有限,仅支持 series(f),其他情况均报错。在出现错误的基础上也完善了语法功能。支持语法1.series(f):默认按symvar(f,1)变量,在0 点展开至 5 阶2.series(f, var):指定变量var,在0 点展开至 5 阶3.series(f, var, a):指定变量var,在a 点展开4.series(__,Name,Value):指定展开点 ExpansionPoint、阶数 Order(Name-Value 参数)使用示例
syms x
f = sqrt(x) + x^2; % 待展开函数

% 示例1:默认展开
s1 = series(f);
disp(s1)

% 示例2:指定展开变量
s2 = series(f,x);
disp(s2)

% 示例3:指定展开点
s3 = series(f,x,1);
disp(s3)

% 示例4:指定展开点inf,展开阶数 9
s4 = series(f,x,'ExpansionPoint',Inf,'Order',9);
disp(s4)
五、int 语法功能完善修复问题当指定参数上下界 a,b 时运行报错。对 int 的所有输入参数组合进行的完善。下面是现已支持的语法。支持语法1.F = int(expr) :计算符号表达式 expr 的积分。使用默认积分变量。2.F = int(expr,var) :计算 expr 关于符号标量变量 var 的不定积分。3.F = int(expr,a,b) :计算 expr 从 a 到 b 的定积分。使用默认积分变量。4.int(expr,[a b]) 等效于 int(expr,a,b)。5.F = int(expr,var,a,b) :计算 expr 关于符号标量变量 var 从 a 到 b 的定积分。6.int(expr,var,[a b]) 等效于 int(expr,var,a,b)。7.F = int(___,Name,Value) :使用一个或多个 Name,Value 参量指定附加选项。支持的 Name 包括 'IgnoreSpecialCases', 'PrincipalValue', 'Hold'。使用示例
% 示例:
% 不定积分
syms x y
disp(int(cos(x)))
% 输出结果为  sin(x)
disp(int(log(x + y), x))
% 输出结果为  x*log(x + y) - x + y*log(x + y)

% 定积分、重积分
disp(int(exp(-x), 0, inf))
% 输出结果为  1
disp(int(2*x, sin(y), cos(y)))
% 输出结果为  cos(2*y)
disp(int(int(exp(-x^2 - y^2), x, -inf, inf), y, -inf, inf))
% 输出结果为  pi

% 保持积分号和计算 Cauchy 主值
syms x;
disp(int(1/(x - 1), x, 0, 2))
% 输出结果为  nan
disp(int(1/(x - 1), x, 0, 2, "Hold", true))
% 输出结果为  Integral(1/(x - 1), (x, 0, 2))
disp(int(1/(x - 1), x, 0, 2, "PrincipalValue", true))
% 0
六、expand 函数bug修复修复问题expand 函数使用均报错,本次解决修复了报错问题。支持语法1.expand(S) 将展开 S 中的所有括号,并通过应用标准恒等式简化 cos(x + y) 等函数的输入。2.expand(S,Name,Value) 使用一个或多个名称-值对组参量指定的附加选项。支持的 Name 包含 'ArithmeticOnly' 、'IgnoreAnalyticConstraints'。使用示例
clear; clc;

%% 示例 1:多项式展开
% 展开二项式 (x+y)^2,验证基本的多项式展开功能
syms x y
g = expand((x+y)^2);
disp(g)        % 输出: x^2 + 2*x*y + y^2

dg = diff(g, x);   % 对展开后的多项式求关于 x 的导数
disp(dg)       % 输出: 2*x + 2*y

%% 示例 2:向量元素的批量展开
% 对向量中的每个元素分别进行展开,演示 horzcat 构造向量及批量展开
syms t
V = horzcat(sin(2*t), cos(2*t));   % 构造水平向量 [sin(2t), cos(2t)]
vf = expand(V);
disp(vf)       % 输出: Matrix([[2*sin(t)*cos(t), 2*cos(t)^2 - 1]])

%% 示例 4:三角函数展开与 ArithmeticOnly 选项
% 对比默认展开与仅算术展开的效果,演示 ArithmeticOnly 选项的作用
syms x
f = (sin(3*x) - 1)^2;
disp(expand(f))    
% 输出: 16*sin(x)^6 - 24*sin(x)^4 + 8*sin(x)^3 + 9*sin(x)^2 - 6*sin(x) + 1(完全展开三角函数)

disp(expand(f, 'ArithmeticOnly', true))  
% 输出: sin(3*x)^2 - 2*sin(3*x) + 1(不展开 sin(3*x),仅展开代数部分)

%% 示例 5:对数展开与 IgnoreAnalyticConstraints 选项
% 对比默认展开与强制展开对数的效果,演示忽略解析约束的作用
syms a b c
f = log((a*b/c)^2);
disp(expand(f))    
% 输出: log(a^2*b^2/c^2)(默认不展开对数,因涉及定义域限制)

disp(expand(f, 'IgnoreAnalyticConstraints', true))  
% 输出: 2*log(a) + 2*log(b) - 2*log(c)(强制展开,忽略 a,b,c>0 的约束)
七、修复 solve 求解多元方程组多个解问题修复问题solve 函数在求解多元方程组含有多个解的问题时会出现报错,修复该问题,并输出结构体数组形式包含解。使用示例
%% 多元方程组求解,多个解
syms u v
% 定义方程组:使用 horzcat 将多个方程水平拼接
% 方程1: 2*u^2 + v^2 = 0  (两个平方项之和为零)
% 方程2: u - v = 1         (线性约束)
eqns = horzcat(2*u^2 + v^2 == 0, u - v == 1);
% 指定求解变量顺序 [v, u]
% vars 的顺序会影响返回结构体 S 中字段的排列:S.v 在前,S.u 在后
vars = horzcat(v, u);% 求解方程组
S = solve(eqns, vars)% 输出包含 v,u 字段的1×2结构体,说明有两组解
disp(S.v) % 输出解的v的值
disp(S.u) % 输出解的u的值
注意:多元方程组得到多个解时的结果保存在结构体数组中,数组的大小代表解的个数,结构体中的字段代表未知变量,使用 disp 显示时需要使用类似 disp(S.x) 的形式来分别显示所有解中x的值。八、新增 log10 函数使用示例
syms x
f = x^3;
fLog10 = log10(f)
disp(fLog10) % 输出 log(x^3)/log(10)

app builder教程咨询

目前我正在尝试将一些MATLAB的GUI界面迁移到北太天元环境中运行,但在兼容性转换过程中遇到了一些困难。特向大家请教:是否有关于将MATLAB GUI转换为北太天元兼容格式的教程或指导资料?我在官网的app builder部分发现案例十分简单,对我目前帮助不大,官网其他部分以及网上也没找到相关资料,如有相关链接资料希望可以分享一下,谢谢大家

匿名 1 0 2026-01-31

关于数学系学生学习编程的一些思考和建议(二)

(转载自公众号:算海扬帆)      那么作为数学系的学生,如果仍想把编程学好,并为数学这把“屠龙刀”找到用武之地,有没有其它的办法呢?答案是肯定的。    目前各种开源编程语言、操作系统、应用软件以及编程工具都已经发展的相当成熟好用,它们一起构成了整个互联网的开源技术底座,而且大多都形成了非常成熟开源社区。个人通过这些开源社区,可以找到非常丰富的入门教程、帮助文档、教学视频等学习资源,还可以在线获得很多技术大咖的及时答疑解惑,完全可以弥补学校编程教育资源的不足和问题。   基于这些互联网上的学习资源,个人想学好编程,还需要充分发挥自己的主观能动性,抛弃所谓的天赋、喜不喜欢、有没有兴趣等主观的、道听途说的、廉价的、即无法证实也无法证伪的想法和疑问,在认真调查研究基础上,结合自己的实际情况,以及学习和职业发展目标的需要,制定一个合理可行的学习计划和方案,然后在不断学习中实践、在不断实践中学习。    下面我将从思想、原则、方法三个层面,分享我们团队在学习编程过程中的一些经验。    从思想观念的角度来讲,首先要给自己的大脑洗个澡,洗去那些错误有害的观念,植入能够反映客观现实的思想。有以下几点需要注意:    停止去问我有没有编程天赋这个问题,这不是一个好问题,因为是与否的回答都不能证实和证伪。   停止去问我对编程有没有兴趣、喜不喜欢的问题,因为在没有深入了解一件事情之前,我们没有资格回答这个问题。   停止去抱怨学校教育的不足之处,因为一个社会组织的发展也有它的内在客观规律(比如经济利益是驱动并决定组织向不同方向发展的根本动力),所以一个组织最后发展到让组织内所有人都不爽的状态,都有它不可抗拒的一面,整天的抱怨只是在宣泄情绪、浪费自己的时间而已。如果你在一个组织中浪费了青春年华,最后还要承担其不好的后果,那就下决心用行动去改变自己,从而把对自己成长的影响降到最低。    作为数学系的学生,我们要对数学本身有信心。不要仅仅停留在数数、买菜这么低的层次上来看待数学。数学是人类智慧皇冠上最灿烂的明珠,是一切自然、社会和工程科学的通行语言,这是真理,不用费时间和脑力去怀疑,我们最好能把数学当成一种信仰。我们暂时看不到、感受不到,不是因为这是不是真理的问题,而是我们还没有达到相应的高度。编程本质上就是把用数学语言描述的解决方案“翻译”为程序代码而已,只要我们能学好数学,就能学好编程。   在智能信息时代,软件才是连接一切的关键,而数学思想和算法则是所有软件的灵魂。因此,身处数学系的你,如果想找一份好工作,成为技术大牛,或者想知道数学到底是如何与自然、科学和工程学科相互作用的,想把数学变成真正的生产力,就需要把编程学好。  从原则的角度来讲,有如下原则我们需要坚持:  少即是多,慢即是快  循序渐进,日积月累  先入门存活,再实践精通  从方法的角度来讲,有如下的方法你可以尝试:   首先快速入门 Linux 及开源编程生产力工具,如:ubuntu、git(版本控制)及开源代码托管平台、cmake、vim、gcc、gdb、vscode 等等,然后在不断的使用过程中实践精通。这里强调的是要用开源工具来学习编程。   在学习编程的过程中,每天坚持写学习复盘总结,通过不断反观、反思、反省自己学习编程的过程,不断提炼总结经验教训,看清自己在学习过程中的思维与行为模式,并不断调整优化。这是一个向自己学习的过程,也是自主学习的核心要义。   可以找一个或多个引路人,定期寻求指导和反馈,帮助及时发现学习中存在的问题,答疑解惑,这样会少走很多弯路,少踩很多坑。   在编程之前,首先要写好编程数学文档。文档要尽量以最简洁明了、逻辑清晰的数学语言来描述要实现的算法,保证每一个计算步骤的正确性。简洁明了、逻辑清晰的数学语言往往意味着对应的程序实现也是简洁明了、逻辑清晰的。注意,这里所说的编程数学文档,不是通常教材上看到的那种伪代码,因为这种伪代码大部分是无法直接翻译成程序语言的。   精通数学中的张量语言,经验表明用它写出的编程数学文档,大部分是可以直接翻译为代码的。   在编程之前,你还要准备好可以用来测试程序运行的简单算例,用于在编程过程中随时测试你的程序。   要实现复杂的算法,先进行分解设计,把算法“正交”分解成很多简单的模块,其中每个模块有明确的功能和输入输出,然后采用增量开发的模式,逐个实现并测试其正确性,最后再集成测试正确性。   去阅读别人的代码时,有与编程相关的数学文档,要先看数学文档。如果没有,就要在看代码的过程中,不断尝试用数学语言来重新阐述这些代码,并写成编程数学文档,再结合一些必要的运行测试,可极大提升理解学习别人代码的速度。  反过来把编程作为学习数学的工具,帮助自己更深刻地理解数学本身。  学会使用符号计算工具,代替纸笔进行数学公式的推导,比如 Python 中 sympy 符号计算工具箱。    以上是我们团队在编程过程中总结的实战经验。目前团队小伙伴陈春雨已通过这一系列学习和实践,成功的从编程菜鸟晋升为大虾,初具亮剑江湖的实力,可见以上经验还是颇具参考性。希望这些经验能够帮到更多想把编程学好的学生。我也会一如既往地探索,从而可以帮助更多学生快速提升编程能力,为社会培养更多既懂理论、又懂实践的综合型人才。    欢迎更多有志于把计算数学变为真正生产力的老师、学生加入我们!    算法时代,未来已来!作为计算数学人,我们应心怀使命,肩扛责任,迎难而上,以攻坚的姿态开拓创新,为解决国家重大“卡脖子”问题贡献自己应有的一份力量,同时为培养新一代中国数学的中坚力量而努力。    相信我们在一起,就会了不起! (原文链接:https://mp.weixin.qq.com/s/vB0qAz2e1QmNMKnBGitEYw)

北太天元客服 1 1 2023-02-20

关于数学系学生学习编程的一些思考和建议(一)

(转载自公众号:算海扬帆)      我见过很多数学系的学生,认为自己编程能力不行,说自己不是编程的那块料,每每遇到需要编程的任务,心里就犯难。即使那些稍微有点勇气的学生,下定决心硬着头皮上,也往往收效甚微,成长缓慢。      这不是一个正常的现象。因为数学系的学生,在经过了几年的学习和训练后,是应该具备相当程度的结构化、定量化的抽象逻辑思维能力,并且能够借助数学的思想和方法,熟练使用数学语言来刻画问题、构造解决方案。对于受过良好训练的数学系学生来说,所谓编程,本质上就是把用数学语言描述的解决方案“翻译”为程序代码而已。数学和计算机编程本来就是天作之合,有数学背景的学生应该具备很大的优势和潜力来学好编程。     我一直认为,能同时掌握数学语言和计算机编程语言的人,到高校一定是科研能手,到公司一定是业务骨干。但现实却是,很多大学的数学院系,仍在不断培养大量害怕编程的学生。如果去问数学系的学生将来要找什么工作,很多人的第一个想法就是当一名老师。如果问关于数学研究的事情,他们非常自然地认为证明分析就是数学研究的全部内容。       数学系的毕业生有很多去了学校,或者金融、互联网这些来钱快的行业。而在中国需要数学重点支撑的科学计算与工业软件领域,我们会发现数学背景出身的人寥寥无几。学生不愿去的直接原因,一方面是对自己编程能力和学习潜力没有信心;另一方面对数学如何应用到科学计算和工业软件领域也没有什么概念,对于实际工业应用背景更是知之甚少,缺乏将数学语言自如转换为应用领域语言的能力。     当前国产科学计算和工业软件远远落后于西方发达国家,在总体上存在基础薄弱、创新不足、人才短缺和应用困难等问题,被结结实实地“卡”着脖子。而要解决这一严峻的问题,培养大量既懂应用数学 、又懂计算机编程和应用物理的综合型人才,并引导他们进入科学计算和工业软件领域,是当下亟需做的事情。(鄂维南院士在《人工智能时代交叉科学的人才培养》一文中对算法时代如何培养人才有更深入细致的阐述)      那么,我们当前的数学教育已经做好培养这些综合性人才的准备了吗?依目前的情况来看,显然没有。数学系的学生,在数学、编程和数学应用之间的自我怀疑、彷徨、痛苦和挣扎,并不是一种偶然现象,而大学数学科研和人才培养体制机制的僵化就是造成这种现象的一个外部客观原因。      时至今日,在很多大学的数学系中,计算机编程教学依然是以教授语法知识为主,对数学核心课程的支撑也仅仅停留在商业软件的使用上,几乎没有关于编程原则、方法、技能和生产力工具的教学内容。      为什么只是教教编程语法?因为承担编程教学的师资,大部分还是数学系出身,基本没有受过正规的计算机编程训练。而且目前高校的这种以“数数”为主的评价机制,让承担编程教学的老师即使有心,也不太可能把大量时间花在学习提高自己编程能力、搞好编程教学的事情上。在师资的引进和培养上,大多学校还是以“戴帽子”的人为主,至于实际需要什么样的师资来为国家、社会培养更有用的人才,往往考虑的不够深入全面。所以,从我上大学到现在,整整 20 年了,大部分数学系的计算机编程教育,依然没有什么变化,而且预计在将来可见的很长一段时间内,整体上也不会有什么实质性的变化。  (原文链接:https://mp.weixin.qq.com/s/vB0qAz2e1QmNMKnBGitEYw)

北太天元客服 0 2 2023-02-20

如何在Windows平台下部署北太天元插件开发环境

由于北太天元发布的开发的插件的SDK是使用GCC编译器生成的,不支持微软编译器的使用,在Windows平台下必须部署对应的 GCC 编译器开发环境才能开展 c/c++ 插件的开发工作。我们可以采用基于MSYS2的MinGW-w64 GCC搭建Windows下C++开发环境。MSYS2是仿Linux的终端交互环境,可以使用Linux下的终端命令和快捷方式,自带pacman软件管理包,让您将精力放到C++代码的编写上,而不是复杂的依赖环境的搭建和编译,可以复用自己在Linux下的开发经验。使用g++进行库的链接、源码编译等操作,可更进一步了解C++代码的编译过程。绿色便携版本的 MSYS2 + MinGW64 开发环境包传送阵如下:北太天元v3.6.1及其之前的软件版本可以使用以下绿色环境:链接: https://pan.baidu.com/s/15KEJ_CZpEjNo_hQ7JIuAeQ提取码: 5361 北太天元v3.6.0-dev(开发预览版)及其之后的软件正式或预览版本将使用以下绿色环境:链接:https://pan.baidu.com/s/12eAGnIMv78ZzoY-G6aKUrw提取码:oeil

Forever 0 1 2023-01-11