matlab 二分法 我的程序总是报错,求大神帮我看看

matlab 二分法 我的程序总是报错,求大神帮我看看,第1张

1:elseif feval('f',a)Jfeval('f',(a+b)/2)>0 多了一个J?

2:你的二分法逻辑就错了,你确定二分法是这个?

首先,按你的逻辑,二分法的两端都要作为参数输入,因此在二分法之前要判断f(a)和f(b)是否异号,否则需要提示更换a、b的值

然后,哪一端更新值为(a+b)/2不仅仅需要知道f(a)和f(b)乘积的正负性,还需知道具体f(a)或f(b)的正负性

最后,你没有函数的输出语句,x0应该是你的方程的解,但没有任何的输出语句,而且x1是起到什么作用的也不明确

a=1;

b=2;

f =@(x)x^3-x-1;

c=(a+b)/2;

while abs(b-a)>1e-5

if f(c)f(b)<0

a=c;

else

b=c;

end

c=(a+b)/2;

x=c;

end

fprintf('\n x = %5f, f(x) = %5f \n', x, f(x));

MATLAB 产品系列重要功能:

MATLAB®: MATLAB 语言的单元测试框架

Trading Toolbox™: 一款用于访问价格并将订单发送到交易系统的新产品

Financial Instruments Toolbox™: 赫尔-怀特、线性高斯和 LIBOR 市场模型的校准和 Monte Carlo 仿真

Image Processing Toolbox™: 使用有效轮廓进行图像分割、对 10 个函数实现 C 代码生成,对 11 个函数使用 GPU 加速

Image Acquisition Toolbox™: 提供了用于采集图像、深度图和框架数据的 Kinect® for Windows®传感器支持

Data Acquisition Toolbox™: 为 Digilent Analog Discovery Design Kit 提供了支持包

Vehicle Network Toolbox™: 为访问 CAN 总线上的 ECU 提供 XCPSimulink 产品系列重要功能

Simulink®: Simulation Performance Advisor,链接库模块的封装,以及通过逻辑表达式控制有效变量

Simulink: 除 LEGO® MINDSTORMS® NXT、Arduino®、Pandaboard 和 Beagleboard 外,还为 RaspberryPi™ 和 Gumstix® Overo® 硬件提供了内置支持

SimRF™: 针对快速仿真和模型加载时间的电路包络求解器

SimMechanics™: 发布了用于从 CAD 和其他系统导入模型的 XML 架构

Simulink Design Verifier™: 数组超出边界检查

这个有

例子

区间二分法:

与对分查找法相同

1

区间二分法求出的仅仅是

方程

的一个单根,如果方程有重根或者多个根时,在做区间二分法时就会出现分叉,这样方程有几个根,就会产生几个实数序列,每一个实数序列的极限便是方程的一个根

2

通常用区间二分法为一些

迭代法

提供靠近x^的初始选代值;

3

区间二分法的缺点是不能求方程的

复数

根。

format

long

a=5;

b=6;

x1=a;

x2=b;

f1=4cos(x1)+4sin(x1)+05x1-2;

f2=4cos(x2)+4sin(x2)+05x2-2;

step=0000001;

ii=0;

while

abs(x1-x2)>step

ii=ii+1;

x3=(x1+x2)/2;

f3=4cos(x3)+4sin(x3)+05x3-2;

if

f3~=0

if

f1f3<0

x2=x3;

else

x1=x3;

end

end

end

x3

f=[4cos(x3)+4sin(x3)+05x3]

disp(['迭代次数:',num2str(ii),'次'])

牛顿迭代法求解:

在方程f(x)=0有

实数根

的情况下,若能够将方程等价地转化成x=g(x)的

形式

,然后取一个初始值x0代入x=g(x)的右端,算得x1=g(x0),再计算x2=g(x1),这样依次类推

x(k+1)=g(x(k))

可以得到一个序列xk,通常称g(x)为迭代

函数

,序列xk为由迭代函数产生得迭代序列,x0为迭代初始值。

同一个方程,不同等价形式的转换产生的迭代法可能收敛,也有可能发散.关于迭代法的敛散性判定有下面的

定理

(也称李普希兹(Lipschitz定理):

如果迭代函数g(x)在区间[a,b]上连续,且满足以下条件,

1

对于任意的x=[a,b],有g(x)=[a,b]

2

在区间内(a,b)内,函数g(x)满足Lipschitz条件,即存在

常数

L>0,使得对于任意的x,y=(a,b),都有|g(x)-g(y)|=<L|x-y|,如果有L<1,则迭代格式xk+1=g(xk),k=0,1,2,

对于任意的迭代初始值x0=[a,b]均是收敛的

这里与x和y无关的正常数L称为Lipschitz常数。

一种较为特殊得迭代法为牛顿(Newton)迭代法

xk+1=xk-f(xk)/f'(xk)

相应迭代函数为

g(x)=x-f(x)/f'(x)

Newton迭代法的几何意义:它的第k+1次迭代值就是曲线y=f(x)在点(xk,f(xk))处切线y-f(xk)=f'(xk)(x=xk)与轴的交点的横坐标,

%解方程:f=4(cos(x1)+sin(x1)+05x1-2)=0

x0=96;

x1=x0-(4(cos(x0)+sin(x0))+05x0-2)/(4(cos(x0)-sin(x0))+05);

while

abs(x1-x0)>0000001

x0=x1;

x1=x1-(4(cos(x0)+sin(x0))+05x0-2)/(4(cos(x0)-sin(x0))+05);

end

f=4(cos(x1)+sin(x1)+05x1-2)

弦截法:

单点弦截法:

连接两个

端点

与作弦(a,f(a))

与(b,f(b))作弦,此弦与轴交点的横坐标设为

x1

如果f(x1)=0,则x1即为所求根,否则选取(x1,f(x1))点和点(a,f(a))(该点的选取要满足条件f(a)与f''(x)

同号

,并改记为(x0,f(x0))。再做弦

此弦与轴交点的横坐标设为

x2,依次类推,其迭代格式即为

xk+1=xk-f(xk)(xk-x0)/(f(xk)-f(x0)

点弦

截法:

无固定点

xk+1=xk-f(xk)(xk-xk-1)/(f(xk)-f(xk-1)

format

long

nx=[];

nx(1)=5;

nx(2)=nx(1)-(2^nx(1)-nx(1)^2-1)/(2^nx(1)log(2)-2nx(1));

k=1;

while

abs(nx(k+1)-nx(k))>=10^(-6)

k=k+1;

nx(k+1)=nx(k)-(2^nx(k)-nx(k)^2-1)/(2^nx(k)log(2)-2nx(k));

end

nk=k+1;

disp(['牛顿迭代法迭代次数:',num2str(nk),blanks(4),'方程的解:',num2str(nx(nk))])

dx=[];

dx(1)=5;

dx(2)=dx(1)-(2^dx(1)-dx(1)^2-1)/((2^3-3^2-1)-(2^5-5^2-1))(3-5);

k=1;

while

abs(dx(k+1)-dx(k))>=10^(-6)

k=k+1;

dx(k+1)=dx(k)-(2^dx(k)-dx(k)^2-1)/((2^dx(k)-dx(k)^2-1)-(2^5-5^2-1))(

dx(k)-5);

end

disp(['单点迭代法迭代次数:',num2str(k),blanks(4),'方程的解:',num2str(dx(k))])

sx=[];

sx(1)=5;

sx(2)=3;

k=1;

while

abs(sx(k+1)-sx(k))>=0000001

k=k+1;

sx(k+1)=sx(k)-((2^sx(k)-sx(k)^2-1)/((2^sx(k)-sx(k)^2-1)-(2^sx(k-1)-sx(k-1)^2-1)))(sx(k)-sx(k-1));

end

sk=k+1;

disp(['双点迭代法迭代次数:',num2str(sk),blanks(4),'方程的解:',num2str(sx(sk))])

x=3:005:5;

y=2^x-x^2-1;

yn=zeros(1,nk);

yd=zeros(1,sk);

subplot(1,2,1)

plot(x,y,sx,yd,'')

title('双点弦截法')

gtext('y=2^x-x^2-1')

subplot(1,2,2)

plot(x,y,nx,yn,'')

title('牛顿迭代法')

gtext('y=2^x-x^2-1')

既然是二分法,肯定要循环使用了额

if abs(b-a)>=delta这一句的if改成while

ya=yc;

end

end

这里面多了一个end,去掉

调用方法:

f=inline('x+1')

a=-2;b=1;delta=0001;

[c,err,yc]=bisect(f,a,b,delta)

源程序没有问题,就是计算的时候你需要建立一个M函数

点击file中的new中的M-file,输入

function y=f(x)

y=x^3-6x-1;

保存后,你再在command window中输入上面的源程序,就可以得到结果,c=25

建议你在第三行插入一个 end,以完成函数的定义

而且函数的定义只有在m文件里面才能做到。 (这很重要!!!)

还有,好像没有与while相应的end

对了,你的函数在[-pi/2,pi/2]里面只有一个解0,所以不好算。建议你换个函数试试看

以上就是关于matlab 二分法 我的程序总是报错,求大神帮我看看全部的内容,包括:matlab 二分法 我的程序总是报错,求大神帮我看看、如何用matlab编写二分法问题、求用MATLAB编制方程求根的二分法和Newton法的 Matlab 程序!!!谢谢~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9304043.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存