高次方程的求解问题

落花生雪 2014-04-23 09:38:16
Y = 3X^3 + 2X^2 + 5X + 6 像这样的高次方程,已经知道了Y值,怎么回推X值啊?
...全文
327 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
落花生雪 2014-04-29
  • 打赏
  • 举报
回复
查了N多资料,有点纠结啊。。。
lpcads 2014-04-24
  • 打赏
  • 举报
回复
最简单的,牛顿法
Yofoo 2014-04-24
  • 打赏
  • 举报
回复
牛顿迭代法, 网上好多例子, 下面有新鲜出来

double	fun(double a ,double b, double c, double d, double x)
{
	return a*x*x*x + b*x*x + c*x + d;
}

double F(double a ,double b, double c, double d, double y)
{
	double x0=1.0, x, f, f1;
	int		t;

	t=0;
	d-=y;
	do
	{
		x = x0;
		f =	a*x*x*x + b*x*x + c*x + d;
		f1 = 3*a*x*x + 2*b*x + c;
		x0 = x-f/f1;
		t++;
	}
	while(fabs(x-x0) >= 1e-5);
	return x;
}

void main()
{
	double	x,y,y2;
	double	a,b,c,d;

	a = 3.0,b=2.0,c=5.0,d=6.0;
	x = F(a,b,c,d, 25.0);
	y2 = fun(a,b,c,d,x);
}


lm_whales 2014-04-24
  • 打赏
  • 举报
回复
其实一个数组,也可以表示多项式,不过系数为0的项,必须表示出来. 一个数组,必须另外记录数组大小,C++ vector 恰好合适. 多项式最高次数+1, 就是数组大小.
lm_whales 2014-04-24
  • 打赏
  • 举报
回复
引用 6 楼 mujiok2003 的回复:
++
引用 9 楼 zzz3265 的回复:
++ 牛顿法,上面6楼,9楼已经有了 牛顿法就是典型的数值解法,另外还有一种二分法,也是一种数值解法. 解析解法,最典型的就是求根公式法,不过只有4次以下方程,有求根公式法. 另外针对你的应用, 先设计一个数据结构表示多项式 最简单的是用一个结构-------系数,次数二元组,表示多项式的一项, 整个多项式用二元组数组(或者 vecotr)表示 或者用两个数组(或者 vecotr),表示多项式 然后写一个多项式求导的函数 再写一个多项式估值的函数 最后,传递 多项式这种数据结构,表示 函数, 对6楼,9楼的算法略作修改,就是多项式反算的根的求法. 然后根据,条件,范围,剔除增根,就可以了. 针对实际问题,这里必有以下结论: 1)必定有实根. 2)特定实根只有一个.
落花生雪 2014-04-24
  • 打赏
  • 举报
回复
double newton_raphson(F func, D derivative, double x0){ double temp, f=0, fd; while (!isnan(x0)) { temp = x0; f = func(x0); if(fabs(f) < 1e-10) break; fd = derivative(x0); x0 = x0 - f/fd; if (fabs(temp - x0) < 1e-10) break; } std::cout << "f(x)=" << f << std::endl; return x0;}[size=18px]isnan func derivative 这些函数怎么实现的? [/size]
落花生雪 2014-04-24
  • 打赏
  • 举报
回复
小弟现在是在做多项式的拟合,二次多项式,三次多项式一直到五次多项式都要用到,我现在要做的是,根据已知的多项式公式,输入Y值,然后回推出X值,需要编程实现,可是我现在连思路都没有。。。。楼上说的解析解法,数值解法,还有牛顿法,能不能说的详细一点,我自己也查点相关的资料,多谢了!
mujiok2003 2014-04-24
  • 打赏
  • 举报
回复
newton raphson,c++ 11
#include <iostream>
#include <cmath>
template<typename F, typename D>
double newton_raphson(F func, D derivative, double x0)
{
  double temp, f=0, fd;
  while (!isnan(x0)) {
    temp = x0;
    f = func(x0); 
    if(fabs(f) < 1e-10)
      break;
    fd = derivative(x0);
    x0 = x0 - f/fd;
    if (fabs(temp - x0) < 1e-10)
      break;
  }
  std::cout << "f(x)=" << f << std::endl;
  return x0;
}


int main()
{
  double root = newton_raphson(
      [](double x)->double{ return 3*x*x*x + 2*x*x +5*x - 15;}, //函数, y = 15
      [](double x)->double{  return 9* x * x + 4*x + 5;}, //导函数
      10
      );
  std::cout << "root:" <<  root<< std::endl;
  return 0;
}
FancyMouse 2014-04-24
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
3次4次有求根公式,即有解析解法. 更高的采用数值解法吧,解析解法,不知道有没有
存在有5次方程(事实上是绝大多数),使得它有一个根无法用有限次加减乘除和开根(无论几次根)来表示出来。
赵4老师 2014-04-23
  • 打赏
  • 举报
回复
http://www.e-tutor.com/et2/graphing/ 输入框里面输入 3*x^3 + 2*x^2 + 5*x + 6 再点Graph按钮。 然后让鼠标在左边生成的函数图像上移动。
wxyb 2014-04-23
  • 打赏
  • 举报
回复
应该是用二分法,计算机记录的数值也不是准确值0.0
lm_whales 2014-04-23
  • 打赏
  • 举报
回复
3次4次有求根公式,即有解析解法. 更高的采用数值解法吧,解析解法,不知道有没有

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧