matlab实现牛顿迭代法求解非线性方程组

已知非线性方程组如下
3*x1-cos(x2*x3)-1/2=0

x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0

exp(-x1*x2)+20*x3+(10*pi-3)/3=0

求解要求精度达到0.00001

---------------------------------------------------------分--割--线---------------------------------------------------------

首先建立函数fun

储存方程组编程如下将fun.m保存到工作路径中:

function f=fun(x);

%定义非线性方程组如下

%变量x1 x2 x3

%函数f1 f2 f3

syms x1 x2 x3

f1=3*x1-cos(x2*x3)-1/2;

f2=x1^2-81*(x2+0.1)^2+sin(x3)+1.06;

f3=exp(-x1*x2)+20*x3+(10*pi-3)/3;

f=[f1 f2 f3];

---------------------------------------------------------分--割--线---------------------------------------------------------

建立函数dfun

用来求方程组的雅克比矩阵将dfun.m保存到工作路径中:

function df=dfun(x);

%用来求解方程组的雅克比矩阵储存在dfun中

f=fun(x);

df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')];

df=conj(df');

---------------------------------------------------------分--割--线---------------------------------------------------------

编程牛顿法求解非线性方程组将newton.m保存到工作路径中:

function x=newton(x0,eps,N);

con=0;

%其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛

for i=1:N;

    f=subs(fun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)});

    df=subs(dfun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)});

    x=x0-f/df;

    for j=1:length(x0);

        il(i,j)=x(j);

    end

    if norm(x-x0)<eps

        con=1;

        break;

    end

    x0=x;

end

 

%以下是将迭代过程写入txt文档文件名为iteration.txt

fid=fopen('iteration.txt','w');

fprintf(fid,'iteration');

for j=1:length(x0)

    fprintf(fid,'         x%d',j);

end

for j=1:i

    fprintf(fid,'\n%6d     ',j);

    for k=1:length(x0)

        fprintf(fid,' %10.6f',il(j,k));

    end

end

if con==1

    fprintf(fid,'\n计算结果收敛!');

end

if con==0

    fprintf(fid,'\n迭代步数过多可能不收敛!');

end

fclose(fid);

---------------------------------------------------------分--割--线---------------------------------------------------------

运行程序

在matlab中输入以下内容

newton([0.1 0.1 -0.1],0.00001,20)

---------------------------------------------------------分--割--线---------------------------------------------------------

输出结果

ans =

 

    0.5000    0.0000   -0.5236

 

---------------------------------------------------------分--割--线---------------------------------------------------------

在iteration中查看迭代过程

 

iteration         x1         x2         x3

     1        0.490718   0.031238  -0.519661

     2        0.509011   0.003498  -0.521634

     3        0.500928   0.000756  -0.523391

     4        0.500227   0.000076  -0.523550

     5        0.500019   0.000018  -0.523594

     6        0.500005   0.000002  -0.523598

     7        0.500000   0.000000  -0.523599

计算结果收敛!

时间: 2025-01-26 16:54:35

matlab实现牛顿迭代法求解非线性方程组的相关文章

java-用MATLAB以外的编程求解非线性方程组,求大牛解答

问题描述 用MATLAB以外的编程求解非线性方程组,求大牛解答 方程组如下图,编写一个可以求解的应用程序,C,C++,java等都可以 解决方案 http://wenku.baidu.com/link?url=HEm12qHNa-mPc-OCoXczb5Cz4VlMvd0e4LajWP21c_fmtN3jVqKje-mYrOMUJLhdcl84FkOc41NceuPAEs9GBYryqkg84VQ7c72euKSKawm 解决方案二: http://wenku.baidu.com/view/d8

《数值分析(原书第2版)》—— 2.7 非线性方程组

2.7 非线性方程组 第1章中包含求解一个未知变量的方程,该方程通常是非线性方程.在本章中,我们已经研究了方程组的求解,但是要求方程组是线性的.结合非线性和"多于一个方程"的因素,大大提高了求解问题的难度.本节中我们将描述牛顿方法及其变体,并用于求解非线性方程组.130 2.7.1 多元牛顿方法 单变量的牛顿方法xk+1=xk-f(xk)f′(xk)提供了多元牛顿方法的主要轮廓.两种方法都是根据泰勒展开的线性近似推导得到,例如,令f1(u,v,w)=0 f2(u,v,w)=0(2.49

如何用c语言解决牛顿迭代法

问题描述 如何用c语言解决牛顿迭代法 用c语言解决牛顿迭代法,要求显示表达式,求大神帮助,期末作业,完不成要挂科,谢谢了 解决方案 一元任意阶次方程求解,注意初始值不正确也有可能得不到解.http://blog.csdn.net/qq_27183003/article/details/49808191 解决方案二: #include <stdio.h> #include <math.h> //y=x^3-5x^2+16x-80 float f(float x) { return (

牛顿迭代法

     牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法. 牛顿迭代公式     设r是\(f(x)=0\)的根,选取\(x_0\)作为r的初始近似值,过点\((x_0,f(x_0))\) ,做曲线 \(y=f(x)\)的切线L,L的方程为\(y=f(x_0)+f'(x_0)(x-x_0)\) ,求出L与x轴交点的横坐标 \[x_1=x_0-\frac{f

c语言-C语言牛顿迭代法,正常运行输出错误结果,求助

问题描述 C语言牛顿迭代法,正常运行输出错误结果,求助 求方程ax^3+bx^2+c^x+d=0的解,其中xn+1=xn-f(xn)/f'(xn) 我的代码这样写的: #include #include int main(void) { int a,b,c,d; printf("Please input four integers:"); scanf("%d %d %d %d",&a,&b,&c,&d); double x,y; x=

C语言实现牛顿迭代法解方程

利用迭代算法解决问题,需要做好以下三个方面的工作: 一.确定迭代变量 在可以用迭代算法解决的问题中,我们可以确定至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 二.建立迭代关系式 所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系).迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成. 三.对迭代过程进行控制 在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题.不能让迭代过程无休止地执行下去.迭代过程的控制通常可分为两种情况

怎么求解这个方程组,急急急急。。。。

问题描述 怎么求解这个方程组,急急急急.... syms x d1 d2; q1='0.11645*x^2-0.040876-d1*x*0.4825971'; q2='d2-d1+0.4825971*x'; q3='1693.87*exp(-0.048909)*normcdf(d1)-1700*exp(-0.011645)*normcdf(d2)-35.95'; fsolve(q1,q2,q3,'x','d1','d2');

C语言OJ项目参考(2405)牛顿迭代法求根

2405: 牛顿迭代法求根 Description 用牛顿迭代法求根.方程为ax3+bx2+cx+d=0.系数a,b,c,d的值一次为1,2,3,4,由主函数输入.求x在1附近的一个实根.求出根后由主函数输出.结果保留两位小数. Input 系数a,b,c,d的值 Output x在1附近的一个实根 Sample Input 1 2 3 4 Sample Output -1.65 HINT 主函数已给定如下,提交时不需要包含下述主函数 /* C代码 */ int main() { double

Hession矩阵与牛顿迭代法

1.求解方程. 并不是所有的方程都有求根公式,或者求根公式很复杂,导致求解困难.利用牛顿法,可以迭代求解. 原理是利用泰勒公式,在x0处展开,且展开到一阶,即f(x) = f(x0)+(x-x0)f'(x0) 求解方程f(x)=0,即f(x0)+(x-x0)*f'(x0)=0,求解x = x1=x0-f(x0)/f'(x0),因为这是利用泰勒公式的一阶展开,f(x) = f(x0)+(x-x0)f'(x0)处并不是完全相等,而是近似相等,这里求得的x1并不能让f(x)=0,只能说f(x1)的值比