c++编程求解二元二次方程组_c++:求解二元二次方程组(解析解)

这个问题从产生到解决,困扰了LZ快一周(当然因为中间也有其他事情要做),本来从LZ的角度是想找第三方库使用,不要说matlab就可以啊o(╥﹏╥)o,确实matlab一个solve函数就解决问题了,但是问题是不能用matlab,所以第一方案排除。

用第三方库?google了半天,发现一个gsl库确实可以求解二元二次方程组,但是也有问题,1)只能求解出一个解,而且无法求解复数解(源代码定义中没有复数定义,除非自己扒源程序,自己写);2)使用的是优化算法,例如牛顿迭代等,所求出的是近似解,非解析解,也就是说求得的结果并不精确。而且初始值的设定会影响迭代结果,容易进入局部最优。3)复数解无法收敛。

PS:花钱的库还是算了,毕竟也不是特别难解决的问题。。。

只剩一个方案:自己动手,丰衣足食O(∩_∩)O哈哈~

列出基本的问题:

a1x2+b1xy+c1y2+d1x+e1y+f1=0

a2x2+b2xy+c2y2+d2x+e2y+f2=0

求上述方程的解(包含复数),也就是两个二次曲线的交点。

step 1: 利用两式相减,用x来表示y

得到类似如下的方程:

(Bx+D)y=−Ax2−Cx−E

其中的A,B,C,D,E都是用a1−f1,a2−f2 所表示的。

step 2:带入原方程得到关于x的一元四次方程

M4x4+M3x3+M2x2+M1x+M0=0

将四次项归一化

x4+bx3+cx2+dx+e=0

step 3: 利用费拉里法求一元四次方程

具体对费拉里法求解一元四次方程的推导:https://baike.baidu.com/item/%E4%B8%80%E5%85%83%E5%9B%9B%E6%AC%A1%E6%96%B9%E7%A8%8B

这里就不在解释了,因为公式很多,手打太浪费时间了。

讲了这么多,贴出源代码:(如果有小伙伴有更好的方法可以和LZ私聊哦)

#include

#include

#include

#include

// #include

#include

#include

void quadratic2quartic(Eigen::Matrix6, 1> & _par1,

Eigen::Matrix6, 1> & _par2,

Eigen::Matrix5, 1> & _y2x_par,

Eigen::Matrix, 5, 1> &_quartic_par)

{

double A, B, C, D, E;

double a1, b1, c1, d1, e1, f1, a2, b2, c2, d2, e2, f2;

a1 = _par1[0];

b1 = _par1[1];

c1 = _par1[2];

d1 = _par1[3];

e1 = _par1[4];

f1 = _par1[5];

// std::cout << a1 << " " << b1 << " " << c1 <<

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值