3次方程求解方程

MATLAB求解非线性方程(转)
最近有多人问如何用matlab解方程组的问题,其实在matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,MATLAB中有两种方法:
(1)x=inv(A)*b —
采用求逆运算解方程组;
(2)x=A — 采用左除运算解方程组。
2x1+3x2=13
&&A=[1,2;2,3];b=[8;13];
&&x=inv(A)*b
即二元一次方程组的解x1和x2分别是2和3。
对于同学问到的用matlab解多次的方程组,有符号解法,方法是:先解出符号解,然后用vpa(F,n)求出n位有效数字的数值解.具体步骤如下:
第一步:定义变量syms x y z ...;
第二步:求解[x,y,z,...]=solve('eqn1','eqn2',...,'eqnN','var1','var2',...'varN');
第三步:求出n位有效数字的数值解x=vpa(x,n);y=vpa(y,n);z=vpa(z,n);...。
如:解二(多)元二(高)次方程组:
x^2+3*y+1=0
y^2+4*x+1=0
解法如下:
&&[x,y]=solve('x^2+3*y+1=0','y^2+4*x+1=0');
&&x=vpa(x,4);
&&y=vpa(y,4);
1.635+3.029*i
1.635-3.029*i
1.834-3.301*i
1.834+3.301*i
二元二次方程组,共4个实数根;
还有的同学问,如何用matlab解高次方程组(非符号方程组)?举个例子好吗?
解答如下:
基本方法是:solve(s1,s2,…,sn,v1,v2,…,vn),即求表达式s1,s2,…,sn组成的方程组,求解变量分别v1,v2,…,vn。
具体例子如下:
x^2 + x*y + y = 3
x^2 - 4*x + 3 = 0
[x,y] = solve('x^2 + x*y + y = 3','x^2 - 4*x + 3 = 0')
运行结果为
即x等于1和3;y等于1和-1.5
= solve('x^2 + x*y + y = 3','x^2 - 4*x + 3=
0','x','y')
结果一样,二元二方程都是4个实根。
通过这三个例子可以看出,用matlab解各类方程组都是可以的,方法也有多种,只是用到解方程组的函数,注意正确书写参数就可以了,非常方便。
from:http://bbs./pc/pccon.php?id=950&nid=14498&tid=0
2、变参数非线性方程组的求解
对于求解非线性方程组一般用fsolve命令就可以了,但是对于方程组中某一系数是变化的,该怎么求呢?
%定义方程组如下,其中k为变量
function F = myfun(x,k)
Pc0=0.23;W=0.18;
F=[Pc0+H*(1+1.5*(x(1)/W-1)-0.5*(x(1)/W-1)^3)-x(2);
x(1)-k*sqrt(x(2))];
Pc0=0.23;W=0.18;
x0 = [2*W; Pc0+2*H]; %
optimset('Display','off');
k=0:0.01:1; % 变量取值范围[0
for i=1:1:length(k)
x = fsolve(@(x) myfun(x,kk), x0,
options);%求解非线性方程组
x1(i)=x(1);
x2(i)=x(2);
plot(k,x1,'-b',k,x2,'-r');
xlabel('k')
legend('x1','x2')
from:/archiver/tid-836299.html
3、非线性方程数值求解
matlab里solve如何使用,是否有别的函数可以代替它.
matlab里我解y=9/17*exp(-1/2*t)*17^(1/2)*sin(1/2*17^(1/2)*t)=0这样的方程为什么只得到0这一个解,如何可以的到1/2*17^(1/2)*t=n*(pi)这样一族解??
在matlab里面solve命令主要是用来求解代数方程(即多项式)的解,但是也不是说其它方程一个也不能解,不过求解非代数方程的能力相当有限,通常只能给出很特殊的实数解。(该问题给出的方程就是典型的超越方程,非代数方程)
从计算机的编程实现角度讲,如今的任何算法都无法准确的给出任意非代数方程的所有解,但是我们有很多成熟的算法来实现求解在某点附近的解。matlab也不例外,它也只能给出任意非代数方程在某点附近的解,函数有两个:fzero和fsolve,具体用法请用help或doc命令查询吧。如果还是不行,你还可以将问题转化为非线性最优化问题,求解非线性最优化问题的最优解,可以用的命令有:fminbnd,
fminsearch, fmincon等等。
*非线性方程数值求解
*单变量非线性方程求解
在MATLAB中提供了一个fzero函数,可以用来求单变量非线性方程的根。该函数的调用格式为:
z=fzero('fname',x0,tol,trace)
其中fname是待求根的函数文件名,x0为搜索的起点。一个函数可能有多个根,但fzero函数只给出离x0最近的那个根。tol控制结果的相对精度,缺省时取tol=eps,trace
指定迭代信息是否在运算中显示,为1时显示,为0时不显示,缺省时取trace=0。
例 求f(x)=x-10x+2=0在x0=0.5附近的根。
步骤如下:
建立函数文件funx.m。
function fx=funx(x)
fx=x-10.^x+2;
(2) 调用fzero函数求根。
z=fzero('funx',0.5)
**非线性方程组的求解
对于非线性方程组F(X)=0,用fsolve函数求其数值解。fsolve函数的调用格式为:
X=fsolve('fun',X0,option)
其中X为返回的解,fun是用于定义需求解的非线性方程组的函数文件名,X0是求根过程的初值,option为最优化工具箱的选项设定。最优化工具箱提供了20多个选项,用户可以使用optimset命令将它们显示出来。如果想改变其中某个选项,则可以调用optimset()函数来完成。例如,Display选项决定函数调用时中间结果的显示方式,其中‘off’为不显示,‘iter’表示每步都显示,‘final’只显示最终结果。
optimset(‘Display’,‘off’)将设定Display选项为‘off’。
例 求下列非线性方程组在(0.5,0.5) 附近的数值解。
(1) 建立函数文件myfun.m。
q=myfun(p)
q(1)=x-0.6*sin(x)-0.3*cos(y);
q(2)=y-0.6*cos(x)+0.3*sin(y);
在给定的初值x0=0.5,y0=0.5下,调用fsolve函数求方程的根。
x=fsolve('myfun',[0.5,0.5]',optimset('Display','off'))
将求得的解代回原方程,可以检验结果是否正确,命令如下:
q=myfun(x)
可见得到了较高精度的结果。
from:.cn/s/blog_56ef652d0100ebew.html
4、fsolve函数解方程
[X,FVAL,EXITFLAG,OUTPUT,JACOB]=FSOLVE(FUN,X0,...)
returns the
Jacobian of FUN at X.
FUN can be specified using
x = fsolve(@myfun,[2 3
4],optimset('Display','iter'))
where myfun is a MATLAB function such
function F = myfun(x)
F = sin(x);
FUN can also be an anonymous
x = fsolve(@(x) sin(3*x),[1
4],optimset('Display','off'))
If FUN is parameterized, you can use
anonymous functions to capture the
problem-dependent parameters. Suppose
you want to solve the system of
nonlinear equations given in the
function myfun, which is parameterized
by its second argument c. Here myfun
is an M-file function such as
function F = myfun(x,c)
F = [ 2*x(1) - x(2) -
exp(c*x(1))
-x(1) + 2*x(2) -
exp(c*x(2))];
To solve the system of equations for
a specific value of c, first assign the
value to c. Then create a
one-argument anonymous function that captures
that value of c and calls myfun with
two arguments. Finally, pass this anonymous
function to FSOLVE:
c = -1; % define parameter
x = fsolve(@(x)
myfun(x,c),[-5;-5])
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。牛顿迭代法 _百度百科
特色百科用户权威合作手机百科
收藏 查看&牛顿迭代法本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
牛顿(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是在17世纪提出的一种在域和域上近似求解方程的方法。外文名Newton's method解决问题确定迭代变量,建立
牛顿(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是在17世纪提出的一种在域和域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广泛用于计算机编程中。设r是的根,选取作为r的初始近似值,过点做的切线L,L的方程为,求出L与x轴交点的横坐标,称x1为r的一次近似值。过点做曲线的切线,并求该切线与x轴交点的横坐标,称为r的二次近似值。重复以上过程,得r的近似值序列,其中,称为r的次近似值,上式称为牛顿公式。
用牛顿迭代法解非线性方程,是把非线性方程线性化的一种近似方法。把在点的某邻域内展开成级数,取其线性部分(即泰勒展开的前两项),并令其等于0,即,以此作为非线性方程的近似方程,若,则其解为, 这样,得到牛顿迭代法的一个迭代关系式:。
已经证明,如果是的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。[1]
军人在进攻时常采用交替掩护进攻的方式,若在上的点表示A,B两人的位置,规定在前面的数大于后面的数,则是A&B,B&A交替出现。但现在假设军中有一个胆小鬼,同时大家又都很照顾他,每次冲锋都是让他跟在后面,每当前面的人占据一个新的位置,就把位置交给他,然后其他人再往前占领新的位置。也就是A始终在B的前面,A向前迈进,B跟上,A把自己的位置交给B(即执行B = A),然后A 再前进占领新的位置,B再跟上,直到占领所有的阵地,前进结束。像这种两个数一前一后逐步向某个位置逼近的方法称为迭代法。
迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
利用迭代算法解决问题,需要做好以下三个方面的工作:
一、确定迭代变量
在可以用迭代算法解决的问题中,至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式
所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
三、对迭代过程进行控制
在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析得出可用来结束迭代过程的条件。最经典的迭代算法是,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表示成a = kb + r,则r = a mod b。假设d是a,b的一个公约数,则有 a%d==0,b%d==0,而r = a - kb,因此r%d==0 ,因此d是(b,a mod b)的公约数
同理,假设d 是(b,a mod b)的公约数,则 b%d==0,r%d==0 ,但是a = kb +r ,因此d也是(a,b)的公约数。
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
欧几里德算法就是根据这个原理来做的,欧几里德算法又叫辗转相除法,它是一个反复迭代执行,直到余数等于0停止的步骤,这实际上是一个循环结构。其算法用C语言描述为:
int Gcd_2(int a,int b)/*欧几里德算法求a,b的最大公约数*/
if (a&=0 || b&=0)/*预防错误*/
while (b & 0)/*b总是表示较小的那个数,若不是则交换a,b的值*/
temp = a %/*迭代关系式*/
从上面的程序我们可以看到a,b是迭代变量,迭代关系是temp = a % b;根据迭代关系我们可以由旧值推出新值,然后循环执a = b = temp;直到迭代过程结束(余数为0)。在这里a好比那个胆小鬼,总是从b手中接过位置,而b则是那个努力向前冲的先锋。还有一个很典型的例子是斐波那契(Fibonacci)数列。为:0、1、1、2、3、5、8、13、21、…,即 fib⑴=0; fib⑵=1;fib(n)=fib(n-1)+fib(n-2) (当n&2时)。
在n&2时,fib(n)总可以由fib(n-1)和fib(n-2)得到,由旧值递推出新值,这是一个典型的迭代关系,所以我们可以考虑迭代算法。
int Fib(int n) //斐波那契(Fibonacci)数列
if (n & 1)/*预防错误*/
if (n == 1 || n == 2)/*特殊值,无需迭代*/
int f1 = 1,f2 = 1,/*迭代变量*/
for(i=3; i&=n; ++i)/*用i的值来限制迭代的次数*/
fn = f1 + f2; /*迭代关系式*/
f1 = f2;//f1和f2迭代前进,其中f2在f1的前面
}double func(double x) //函数
return x*x*x*x-3*x*x*x+1.5*x*x-4.0;
double func1(double x) //导函数
return 4*x*x*x-9*x*x+3*x;
int Newton(double *x,double precision,int maxcyc) //迭代次数
double x1,x0;
for(k=0;k&k++)
if(func1(x0)==0.0)//若通过初值,函数返回值为0
printf(&迭代过程中导数为0!\n&);
x1=x0-func(x0)/func1(x0);//进行牛顿迭代计算
if(fabs(x1-x0)&precision || fabs(func(x1))&precision) //达到结束条件
*x=x1; //返回结果
else //未达到结束条件
x0=x1; //准备下一次迭代
printf(&迭代次数超过预期!\n&); //迭代次数达到,仍没有达到精度
int main()
printf(&输入初始迭代值x0:&);
scanf(&%lf&,&x);
printf(&输入最大迭代次数:&);
scanf(&%d&,&maxcyc);
printf(&迭代要求的精度:&);
scanf(&%lf&,&precision);
if(Newton(&x,precision,maxcyc)==1) //若函数返回值为1
printf(&该值附近的根为:%lf\n&,x);
else //若函数返回值为0
printf(&迭代失败!\n&);
}//此函数是用来求一元3次方程ax^3+bx^2+cx+d=0的解
//比如 x^3-27=0,我们就可以输入1 0 0 -27,这样我们就可以得到一个解
#include&iostream&
#include&cmath&
int main()
double diedai(double a,double b,double c,double d,double x);
double a,b,c,d;
double x=10000.0;
cout&&&请依次输入方程四个系数:&;
cin&&a&&b&&c&&d;
x=diedai(a,b,c,d,x);
double diedai(double a,double b,double c,double d,double x)
while(abs(a*x*x*x+b*x*x+c*x+d)&0.000001)
x=x-(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c);
}function y=f(x)
y=f(x);%函数f(x)的表达式
function z=h(x)
z=h(x);%函数h(x)的表达式
endx=X;%迭代初值
i=0;%迭代次数计算
while i&= 100%迭代次数
x0=X-f(X)/h(X);%牛顿迭代格式
if abs(x0-X)&0.01;%收敛判断
else break
fprintf('\n%s%.4f\t%s%d','X=',X,'i=',i) %输出结果Python代码以实例展示求解f(x) = (x-3)**3,f(x) = 0 的根。def f(x):
return (x-3)**3 ’''定义f(x) = (x-3)**3'''
def fd(x):
return 3*((x-3)**2) ’''定义f'(x) = 3*((x-3)**2)
def newtonMethod(n,assum):
print('A = ' + str(A) + ',B = ' + str(B) + ',time = ' + str(time))
if f(x) == 0.0:
return time,x
Next = x - A/B
print('Next x = '+ str(Next))
if A == f(Next): print('Meet f(x) = 0,x = ' + str(Next)) ’''设置迭代跳出条件,同时输出满足f(x) = 0的x值'''
returnnewtonMethod(n+1,Next)
newtonMethod(0,4.0) ’''设置从0开始计数,x0 = 4.0'''
新手上路我有疑问投诉建议参考资料 查看经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
请扫描分享到朋友圈Matlab求解线性方程组、非线性方程组_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
43页免费4页免费4页免费2页¥1.003页免费 11页免费7页免费9页1下载券4页1下载券1页免费
喜欢此文档的还喜欢4页免费23页免费2页免费13页免费43页免费
Matlab求解线性方程组、非线性方程组|M​a​t​l​a​b​求​解​线​性​方​程​组​、​非​线​性​方​程​组
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢}

我要回帖

更多关于 3次方程求解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信