找回密码
 注册
Simdroid-非首页
查看: 208|回复: 13

请教一个一元六次方程求根的问题

[复制链接]
发表于 2011-1-16 10:32:47 | 显示全部楼层 |阅读模式 来自 浙江宁波
本帖最后由 nbulwc 于 2011-1-16 13:00 编辑

大家好,我在用fzero求解一个一元六次方程求根所遇到了一个问题,举例如下:
clear;
format long
aa=0:2:10;                     (%即aa=0、2、4、6、8、10共六个已知数)
[email=y=@(aa]y=@(aa[/email]) arrayfun(@(a) fzero(@(x) x^6-2*a^2*x^4-3*x^2-4*a,1),aa);
     该一元六次方程中a为一变化的已知参数,x为要求解的根,按理说该方程在一确定的a之下有6个根,总共有36个根(包括复根)。
     但我知道fzero求根时,只能求解初值(如我取的1)附近的一个根,但我想把上述方程的全部根求解出来,而且只要实数根,请教各位版主老师和高手们是不是要用roots求解全部根(因为上述方程式一个多项式),或者可以用fsolve函数求解啊,看了matlab中help里这两个函数的解法,好像也不能解决我的问题。
     哪位好心人和大虾能帮帮忙,万分感谢!:loveliness:
发表于 2011-1-16 10:46:00 | 显示全部楼层 来自 山东淄博
Simdroid开发平台
本帖最后由 wanglu 于 2011-1-16 10:47 编辑

用Forcal求解,代码:
  1. !using["fcopt"];
  2. f(x,a)=x^6-2*a^2*x^4-3*x^2-4*a;
  3. main(:i)= i=0, while{i<=10, isolve[HFor("f"), optsameabs,1e-3, optpara,i], i=i+2};
复制代码

-1.316074012952492        0.                        -8.881784197001252e-016
-6.135682211547814e-051   0.                        -1.129397886033128e-100
1.316074012952492         0.                        -8.881784197001252e-016
-2.90963535818638         2.                        6.394884621840902e-014
2.90963535818638          2.                        6.394884621840902e-014
-5.666476068423917        4.                        2.899014361901209e-012
5.666476068423917         4.                        2.899014361901209e-012
-8.488007045046921        6.                        -7.401013135677204e-011
8.488007045046921         6.                        -7.401013135677204e-011
-11.31483032145368        8.                        -4.114326657145284e-010
11.31483032145368         8.                        -4.114326657145284e-010
-14.14270124976946        10.                       5.32054400537163e-010
14.14270124976946         10.                       5.32054400537163e-010

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-1-16 11:25:13 | 显示全部楼层 来自 湖北武汉
1# nbulwc
试试这个:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2011-1-16 13:26:45 | 显示全部楼层 来自 浙江宁波
本帖最后由 nbulwc 于 2011-1-16 13:43 编辑

感谢wanglu,你的方法可行,但我用的是matlab,你的这个求解不能在matlab中用吧!
谢谢maplelab版主老师,你用的这个fsolve求解我不知道如何用,你采用的和matlab感觉有点不一样!在你们的求解结果下我发现所求解的根具有对称性,因为此函数是偶函数。我的源代码如下图:求解结果和你们一样,因为初值为1,所有求解的解都是正根。但这样只是能求解在初值1下的正根,能不能把在其它初值下的所有根都求出来。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2011-1-16 14:04:05 | 显示全部楼层 来自 浙江宁波
求求maplelab版主老师能不能把你的求解方法再说的清楚一点,只是我是初学者,对你的方法不是很懂。我刚才用roots求根验证了一下,两位高手的方法都是正确的,而且是所求的全部实根,该方程只有那么多实根!
      多谢了!
回复 不支持

使用道具 举报

发表于 2011-1-16 14:54:01 | 显示全部楼层 来自 湖北武汉
5# nbulwc

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-1-16 15:54:32 | 显示全部楼层 来自 北京
看了matlab中help里这两个函数的解法,好像也不能解决我的问题

hoho...
  1. clc;clear;
  2. Resultsx=[];Resultsfval=[];
  3. for i1=0:2:10
  4.     for i=-100:2:100
  5.         [x,fval]=fzero(@SolveLoop,i,[],i1);
  6.         Resultsx=[Resultsx,x];
  7.         Resultsfval=[Resultsfval,fval];
  8.     end
  9.     ind=find(Resultsfval<=1e-6);
  10.     Resultsx=unique(roundn(Resultsx(ind),-5));
  11.     assignin('base',['x',num2str(i1)],Resultsx);
  12.     Resultsx=[];Resultsfval=[];
  13. end
复制代码
新建一个函数:
  1. function y=SolveLoop(x,a)
  2. y=x.^6-2*a^2*x.^4-3*x.^2-4*a;
复制代码
答案:
  1. >> x0
  2. x0 =
  3.    -1.3161         0    1.3161
  4. >> x2
  5. x2 =
  6.    -2.9096    2.9096
  7. >> x4
  8. x4 =
  9.    -5.6665    5.6665
  10. >> x6
  11. x6 =
  12.    -8.4880    8.4880
  13. >> x8
  14. x8 =
  15.   -11.3148   11.3148
  16. >> x10
  17. x10 =
  18.   -14.1427   14.1427
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-1-16 16:28:15 | 显示全部楼层 来自 北京西城
  1. clear;clc;close all
  2. f=@(x,a)x.^6-2*a^2*x.^4-3*x.^2-4*a;
  3. a0=2:2:10;
  4. [res,fval]=arrayfun(@(a0)fzero(@(x)f(x,a0),a0),a0);
复制代码
  1. res =

  2.     2.9096    5.6665    8.4880   11.3148   14.1427


  3. fval =

  4.   1.0e-008 *

  5.     0.0000   -0.0004   -0.0074   -0.0411   -0.1330
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-1-16 19:02:20 | 显示全部楼层 来自 浙江宁波
谢谢6#maplelab版主老师的解答,很简洁,很容易懂,思路清晰,没想到roots函数也能编写成匿名函数形式,最后把复数根也求解出来了。
   感谢7#bainhome高手的解法,感觉您好强啊,编写的稍微难懂些,但解决的很好。
   多谢8#qibbxxt版主老师的回复,感觉和我的方法差不多,只是多了误差分析吧。
   看了上面三位高手写的代码,受益匪浅,你们无私的解答令我由衷的感谢你们。初学matlab,感觉很有难度的,看了三位高手们编写的程序,很是佩服,要向你们学习!再次感谢啦!
回复 不支持

使用道具 举报

 楼主| 发表于 2011-1-16 19:39:20 | 显示全部楼层 来自 浙江宁波
不好意思,能不能再请教一下maplelab、bainhome、qibbxxt三位老师和其他的高手们一下还是有关这个方程的问题。
      我按照你们的方法把此方程的根求解出来后,如果只要某一具体a值下(如a=2)的两个实根(可以像数学中的表示方法记为)xi(i=1、2),并把xi代入下式中:
Ki=A/xi+B*xi+C*xi^2+D*xi^3+E*xi^4(其中A、B、C、D、E均为已知常数),请教这个循环要如何实现啊。
      另外,如果再加上a值变化下(a=0:2:10),在每一个a取值下,把每次求解出来的根xi取出来代入上式中,以求解Ki值,一共6组Ki值,共6*2+2=14个Ki值(其中a=0时,改组有4个实数根,其他a之下都是2个实根),这个循环又要如何实现?
       谢谢了,多次麻烦,很是感激!
回复 不支持

使用道具 举报

发表于 2011-1-17 18:04:08 | 显示全部楼层 来自 北京
这个其实就是一元三次方程阿 ,可以给出解析解的

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-1-17 20:25:50 | 显示全部楼层 来自 浙江宁波
谢谢waynebuaa,其实上面的方程只是我例举的一个例子,想通过这个方法来解决我要求解的一个问题,那样的话是没办法给出解析解的。不过还是谢谢你从数学方面的提醒!
回复 不支持

使用道具 举报

发表于 2011-1-18 11:04:25 | 显示全部楼层 来自 北京
10# nbulwc
在中文论坛我的书籍板块给你回了,这里再重新给你回一下,参考下下面代码:
包含复数根的情况:

  1. f=@(a) roots([1 0 -2*a^2 0 -3 0 -4*a]);
  2. AllRoots = arrayfun(f,0:2:10,'uniformoutput',0);
  3. A = 1;B = 1;C = 1;D = 1;E = 1;
  4. Ki = @(xi) A./xi+B*xi+C*xi.^2+D*xi.^3+E*xi.^4;
  5. Result = cellfun(@(x) feval(Ki,x),AllRoots,'UniformOutput',0);
复制代码
不包含复数根的情况:

  1. f=@(a) feval(@(x)x((imag(x)==0)),roots([1 0 -2*a^2 0 -3 0 -4*a]));
  2. AllRoots = arrayfun(f,0:2:10,'uniformoutput',0);
  3. A = 1;B = 1;C = 1;D = 1;E = 1;
  4. Ki = @(xi) A./xi+B*xi+C*xi.^2+D*xi.^3+E*xi.^4;
  5. Result = cellfun(@(x) feval(Ki,x),AllRoots,'UniformOutput',0);
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-1-18 13:24:09 | 显示全部楼层 来自 浙江宁波
谢谢版主rocwoods吴鹏老师了,您太用心了。我验证了你的代码,可以的,太感谢了!
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-5 03:19 , Processed in 0.069388 second(s), 23 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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