求推荐可代替 matlab 部分功能的第三方数学库

2016-02-14 22:41:08 +08:00
 kindlebeta

小弟最近在编一个工程方面的计算软件,在求解非线性方程组的根时遇到了一些问题,特来向各位大神请教。
方程组如下所示(双曲线方程), s,b,h2 未知量,其他为符号为已知数
(r1-s)^2 / (r2-s)^2 - (h1-h2)^2 / b^2 - 1 = 0
(r3-s)^2 / (r2-s)^2 - (h3-h2)^2 / b^2 - 1 = 0
[b*(r3-s) / (r2-s)^2 ] / [(r3-s)^2 / (r2-s)^2-1)]^0.5 - k = 0

以往是用的 matlab 的 solve 函数来求解方程组的符号解,现在希望脱离 matlab 环境,程序能够独立运行。
最好能直接使用 C#能够调用的数学库,当前搜集到的方法有:

1.利用 Matlab 二次开发,需要电脑上安装有 Matlab 或者 mablab 环境,不方便
2.C#有第三方的 mathnet 数学库,但是只能用来解线性方程,没有非线性方程的功能
3.C++的 gsl 库,貌似是利用牛顿迭代法求的根,但只能得到一个解,并且需要事先指定初始值
4.python 的相关数学库,没有试过

请大家提供下思路,还有有什么库或者方法,最好是能像 matlab 那样计算出所有的符号解或者多个数值解来,再次感谢。

4307 次点击
所在节点    编程
27 条回复
kindlebeta
2016-02-15 11:39:33 +08:00
@theoractice 当时算了好长时间都没反应,还以为不能算呢,哈哈
theoractice
2016-02-15 11:42:44 +08:00
@kindlebeta 这种科学计算一俩小时算不出来太正常了。只要没出错,等一天也得等。
kindlebeta
2016-02-15 13:16:10 +08:00
@theoractice 我用你上面的算了一下,却算不出来,提示的却是
Warning: Explicit solution could not be found.
> In solve at 81
s =
[ empty sym ]
b =
[]
h2 =
[]
>>
难道是因为版本的问题吗?我的是 R2010a
theoractice
2016-02-15 14:02:43 +08:00
那必须是版本问题。我来刷个屏
>> [s b h2]=solve('(r1-s)^2 / (r2-s)^2 - (h1-h2)^2 / b^2 - 1','(r3-s)^2 / (r2-s)^2 - (h3-h2)^2 / b^2 - 1','(b*(r3-s) / (r2-s)^2) / ((r3-s)^2 / (r2-s)^2-1)^0.5 - k','s','b','h2')

s =

(h1^2*r3 - 2.0*h1*h3*r3 - 2.0*h1*k*r2^2 + 2.0*h1*k*r3^2 + h3^2*r3 - 1.0*h3*k*r1^2 + 2.0*h3*k*r1*r3 + 2.0*h3*k*r2^2 - 3.0*h3*k*r3^2 + 2.0*k^2*r1*r2^2 - 2.0*k^2*r1*r3^2 - 2.0*k^2*r2^2*r3 + 2.0*k^2*r3^3)/(h1^2 - 2.0*h1*h3 + h3^2 + 4.0*k^2*r3^2 + 4.0*k^2*r1*r2 - 4.0*k^2*r1*r3 - 4.0*k^2*r2*r3 - 4.0*h1*k*r2 + 4.0*h1*k*r3 + 4.0*h3*k*r2 - 4.0*h3*k*r3) + ((k*r1^2 - 2.0*k*r1*r3 + k*r3^2)*(h1*r2^2 + h1*r3^2 + h3*r1^2 - 1.0*h3*r2^2 + r2*(-1.0*(r1 - 1.0*r2)*(h1 - 1.0*h3 - 1.0*k*r1 + k*r3)*(h1*r1 + h1*r2 - 2.0*h1*r3 - 1.0*h3*r1 - 1.0*h3*r2 + 2.0*h3*r3 + k*r1^2 - 1.0*k*r1*r2 - 1.0*k*r1*r3 + k*r2*r3))^(1/2) - 1.0*r3*(-1.0*(r1 - 1.0*r2)*(h1 - 1.0*h3 - 1.0*k*r1 + k*r3)*(h1*r1 + h1*r2 - 2.0*h1*r3 - 1.0*h3*r1 - 1.0*h3*r2 + 2.0*h3*r3 + k*r1^2 - 1.0*k*r1*r2 - 1.0*k*r1*r3 + k*r2*r3))^(1/2) - 1.0*k*r1*r2^2 + k*r1^2*r2 + k*r1*r3^2 - 1.0*k*r1^2*r3 - 1.0*k*r2*r3^2 + k*r2^2*r3 - 2.0*h1*r2*r3 - 2.0*h3*r1*r3 + 2.0*h3*r2*r3))/((r1^2 - 2.0*r1*r3 + r3^2)*(h1^2 - 2.0*h1*h3 + h3^2 + 4.0*k^2*r3^2 + 4.0*k^2*r1*r2 - 4.0*k^2*r1*r3 - 4.0*k^2*r2*r3 - 4.0*h1*k*r2 + 4.0*h1*k*r3 + 4.0*h3*k*r2 - 4.0*h3*k*r3))
(h1^2*r3 - 2.0*h1*h3*r3 - 2.0*h1*k*r2^2 + 2.0*h1*k*r3^2 + h3^2*r3 - 1.0*h3*k*r1^2 + 2.0*h3*k*r1*r3 + 2.0*h3*k*r2^2 - 3.0*h3*k*r3^2 + 2.0*k^2*r1*r2^2 - 2.0*k^2*r1*r3^2 - 2.0*k^2*r2^2*r3 + 2.0*k^2*r3^3)/(h1^2 - 2.0*h1*h3 + h3^2 + 4.0*k^2*r3^2 + 4.0*k^2*r1*r2 - 4.0*k^2*r1*r3 - 4.0*k^2*r2*r3 - 4.0*h1*k*r2 + 4.0*h1*k*r3 + 4.0*h3*k*r2 - 4.0*h3*k*r3) + ((k*r1^2 - 2.0*k*r1*r3 + k*r3^2)*(h1*r2^2 + h1*r3^2 + h3*r1^2 - 1.0*h3*r2^2 - 1.0*r2*(-1.0*(r1 - 1.0*r2)*(h1 - 1.0*h3 - 1.0*k*r1 + k*r3)*(h1*r1 + h1*r2 - 2.0*h1*r3 - 1.0*h3*r1 - 1.0*h3*r2 + 2.0*h3*r3 + k*r1^2 - 1.0*k*r1*r2 - 1.0*k*r1*r3 + k*r2*r3))^(1/2) + r3*(-1.0*(r1 - 1.0*r2)*(h1 - 1.0*h3 - 1.0*k*r1 + k*r3)*(h1*r1 + h1*r2 - 2.0*h1*r3 - 1.0*h3*r1 - 1.0*h3*r2 + 2.0*h3*r3 + k*r1^2 - 1.0*k*r1*r2 - 1.0*k*r1*r3 + k*r2*r3))^(1/2) - 1.0*k*r1*r2^2 + k*r1^2*r2 + k*r1*r3^2 - 1.0*k*r1^2*r3 - 1.0*k*r2*r3^2 + k*r2^2*r3 - 2.0*h1*r2*r3 - 2.0*h3*r1*r3 + 2.0*h3*r2*r3))/((r1^2 - 2.0*r1*r3 + r3^2)*(h1^2 - 2.0*h1*h3 + h3^2 + 4.0*k^2*r3^2 + 4.0*k^2*r1*r2 - 4.0*k^2*r1*r3 - 4.0*k^2*r2*r3 - 4.0*h1*k*r2 + 4.0*h1*k*r3 + 4.0*h3*k*r2 - 4.0*h3*k*r3))
(h1^2*r3 - 2.0*h1*h3*r3 + 2.0*h1*k*r2^2 - 2.0*h1*k*r3^2 + h3^2*r3 + h3*k*r1^2 - 2.0*h3*k*r1*r3 - 2.0*h3*k*r2^2 + 3.0*h3*k*r3^2 + 2.0*k^2*r1*r2^2 - 2.0*k^2*r1*r3^2 - 2.0*k^2*r2^2*r3 + 2.0*k^2*r3^3)/(h1^2 - 2.0*h1*h3 + h3^2 + 4.0*k^2*r3^2 + 4.0*k^2*r1*r2 - 4.0*k^2*r1*r3 - 4.0*k^2*r2*r3 + 4.0*h1*k*r2 - 4.0*h1*k*r3 - 4.0*h3*k*r2 + 4.0*h3*k*r3) - (1.0*(k*r1^2 - 2.0*k*r1*r3 + k*r3^2)*(h1*r2^2 + h1*r3^2 + h3*r1^2 - 1.0*h3*r2^2 + r2*(-1.0*(r1 - 1.0*r2)*(h1 - 1.0*h3 + k*r1 - 1.0*k*r3)*(h1*r1 + h1*r2 - 2.0*h1*r3 - 1.0*h3*r1 - 1.0*h3*r2 + 2.0*h3*r3 - 1.0*k*r1^2 + k*r1*r2 + k*r1*r3 - 1.0*k*r2*r3))^(1/2) - 1.0*r3*(-1.0*(r1 - 1.0*r2)*(h1 - 1.0*h3 + k*r1 - 1.0*k*r3)*(h1*r1 + h1*r2 - 2.0*h1*r3 - 1.0*h3*r1 - 1.0*h3*r2 + 2.0*h3*r3 - 1.0*k*r1^2 + k*r1*r2 + k*r1*r3 - 1.0*k*r2*r3))^(1/2) + k*r1*r2^2 - 1.0*k*r1^2*r2 - 1.0*k*r1*r3^2 + k*r1^2*r3 + k*r2*r3^2 - 1.0*k*r2^2*r3 - 2.0*h1*r2*r3 - 2.0*h3*r1*r3 + 2.0*h3*r2*r3))/((r1^2 - 2.0*r1*r3 + r3^2)*(h1^2 - 2.0*h1*h3 + h3^2 + 4.0*k^2*r3^2 + 4.0*k^2*r1*r2 - 4.0*k^2*r1*r3 - 4.0*k^2*r2*r3 + 4.0*h1*k*r2 - 4.0*h1*k*r3 - 4.0*h3*k*r2 + 4.0*h3*k*r3))
(h1^2*r3 - 2.0*h1*h3*r3 + 2.0*h1*k*r2^2 - 2.0*h1*k*r3^2 + h3^2*r3 + h3*k*r1^2 - 2.0*h3*k*r1*r3 - 2.0*h3*k*r2^2 + 3.0*h3*k*r3^2 + 2.0*k^2*r1*r2^2 - 2.0*k^2*r1*r3^2 - 2.0*k^2*r2^2*r3 + 2.0*k^2*r3^3)/(h1^2 - 2.0*h1*h3 + h3^2 + 4.0*k^2*r3^2 + 4.0*k^2*r1*r2 - 4.0*k^2*r1*r3 - 4.0*k^2*r2*r3 + 4.0*h1*k*r2 - 4.0*h1*k*r3 - 4.0*h3*k*r2 + 4.0*h3*k*r3) - (1.0*(k*r1^2 - 2.0*k*r1*r3 + k*r3^2)*(h1*r2^2 + h1*r3^2 + h3*r1^2 - 1.0*h3*r2^2 - 1.0*r2*(-1.0*(r1 - 1.0*r2)*(h1 - 1.0*h3 + k*r1 - 1.0*k*r3)*(h1*r1 + h1*r2 - 2.0*h1*r3 - 1.0*h3*r1 - 1.0*h3*r2 + 2.0*h3*r3 - 1.0*k*r1^2 + k*r1*r2 + k*r1*r3 - 1.0*k*r2*r3))^(1/2) + r3*(-1.0*(r1 - 1.0*r2)*(h1 - 1.0*h3 + k*r1 - 1.0*k*r3)*(h1*r1 + h1*r2 - 2.0*h1*r3 - 1.0*h3*r1 - 1.0*h3*r2 + 2.0*h3*r3 - 1.0*k*r1^2 + k*r1*r2 + k*r1*r3 - 1.0*k*r2*r3))^(1/2) + k*r1*r2^2 - 1.0*k*r1^2*r2 - 1.0*k*r1*r3^2 + k*r1^2*r3 + k*r2*r3^2 - 1.0*k*r2^2*r3 - 2.0*h1*r2*r3 - 2.0*h3*r1*r3 + 2.0*h3*r2*r3))/((r1^2 - 2.0*r1*r3 + r3^2)*(h1^2 - 2.0*h1*h3 + h3^2 + 4.0*k^2*r3^2 + 4.0*k^2*r1*r2 - 4.0*k^2*r1*r3 - 4.0*k^2*r2*r3 + 4.0*h1*k*r2 - 4.0*h1*k*r3 - 4.0*h3*k*r2 + 4.0*h3*k*r3))
theoractice
2016-02-15 14:54:09 +08:00
哎, b 实在太长这里贴不下。还是不污染环境了。
http://pastebin.com/ddDcu0N7
LZ 去看吧。
facat
2016-02-15 15:00:12 +08:00
用牛顿法吧,自己写很容易的
jakiepaper
2016-02-15 18:18:27 +08:00
@kindlebeta 我不会。。。(哭)没解过复数的问题,不会。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/256483

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX