cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 978|回复: 3

[fx-9860/9750] CAS 表达式计算实现

[复制链接]
发表于 2023-4-18 14:24:33 | 显示全部楼层 |阅读模式
本帖最后由 地主家的好儿子 于 2023-4-21 15:29 编辑

准备分几个章节讲解在高级语言上实现代数表达式的功能,matlab中的符号系统运算让我感到很神秘,CAS,最近研究了一个很基本的CAS系统-Swan,它不太完善,但是可以一窥CAS的内核,符号系统是如何运行的,中间涉及到哪些内容
一、展开表达式的情况
1)不带有未知数的表达式
举个例子吧
(3+9)/2*5*pi
2)带有未知数的表达式存储

数学表达式通常由常数、符号、变量名组成
x*y+(2*x-1)*z
其中变量有3个,常量有2个,因为xyz三个都是未知数,所以表达式的值也是未知的,
3)表达式的展开
举个例子吧
(x-1)*(x+1)
初中数学,按逐项相乘
x*x +x*(-1) +x*(1) -1*(1)
  1. --运行结果如下
  2. x = sym('x')   --定义一个成为x的变量
  3. y = (x-1)*(x+1)  --定义一个表达式y
  4. print(tostring(y))
  5. (x + -1*1)*(x + 1)  
  6. print(y:expand())  --将表达式展开
  7. -1*1 + -1*x + x*1 + x*x
复制代码

代码在lua 5.1 环境下测试,在fxlua中环境中也测试通过

syms.lua

5.67 KB, 下载次数: 5

评分

参与人数 1金钱 +6 收起 理由
mrlgs + 6 很给力!

查看全部评分

 楼主| 发表于 2023-4-19 11:08:20 | 显示全部楼层
思维不能分割,技术可以拆分
分割线后是技术线路图
------------------------------
多项式展开 expand()
多项式基于升幂排序合并和系数提出 exp_order()和coeff()
多项式因子分解 factor()和cancel()
带分母的表达式化简split ()
 楼主| 发表于 2023-4-21 15:38:24 | 显示全部楼层
本帖最后由 地主家的好儿子 于 2023-4-21 17:03 编辑

描述升幂化简问题花了这么多篇幅,代码稍显复杂和混乱,已经接近600行了
但至少解决了swan 里面无法正负项消除的bug
----------------------------------
接下来就是多项式求根问题root()和simple()两个函数族
原先的那几个函数又有点绷不住了
发表于 2023-4-23 20:03:57 | 显示全部楼层
赞一个,难得有人研究这些技术。
顺便,可以参考eigenmath的实现:https://github.com/georgeweigt/e ... src/eval_multiply.c
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cnCalc计算器论坛

GMT+8, 2024-2-25 09:26 , Processed in 0.050525 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表