求助:用Matlab编写最小二乘法程序 是关于二元一次方程的 y=ax1+bx2+c y=[a,b,c,d,e,f,g] x1=[a1,b1,c1,d1

求助:用Matlab编写最小二乘法程序 是关于二元一次方程的 y=ax1+bx2+c y=[a,b,c,d,e,f,g] x1=[a1,b1,c1,d1,第1张

y=[a,b,c,d,e,f,g]';

x1=[a1,b1,c1,d1,e1,f1,g1]';

x2=[a2,b2,c2,d2,e2,f2,g2]';

std=ones(7,1);%这里7代表有几个值,可以修改。eg,a—g就有7个值。

x=[std,x1,x2];%对应于y=c+ax1+bx2

[b,bint,r,rint,stats]=regress(y,x) %矩阵b的值就是c,a,b的值

这个有例子

区间二分法:

与对分查找法相同

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)|=

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')

close all;

clear;

clc;

x = zeros(40);

y = zeros(40);

x(1) = -2;

for i = 2 : 40

x(i+1) = x(i)+ 01;

end

for i = 1: 40

a= 1 - x(i)^3;

if (a == 0)

y(i) = 0;

elseif (a <0)

y(i) = - pow2(1/5log2(abs(a)));

elseif (a >0)

y(i) = pow2(1/5log2(abs(a)));

end

end

分好少啊,不过还是帮你做了吧,方法不一定是最好的,但是做出来了就行,再追加点分吧

function newton(x0,e,N)

%输入xo为估计的迭代初值,e为规定的误差,N为最大迭代次数

%输出x,y为最后迭代的两个近似根,k为迭代次数

clc

format long;

disp('迭代次数 近似根')

k=0;

x1=0;

x2=x0;

while (abs(x2-x1))>e

x1=x2;

x2=x1-f(x1)/df(x1);

k=k+1;

if k>N

return;

end

%%%%%%记录并输出%%%%%%%%%

o1=sprintf('%3d',k);

o2=sprintf('%38f',x2);

OL=[o1,' ' o2];

disp(OL);

y(k)=x2;

end

%%%%画图%%%%%%%

i=1:k;

figure(2)

plot(i,y,'rD-')

grid on

xlabel('迭代次数')

ylabel('近似根')

title(['牛顿法求出的该方程的近似根 x^=', num2str(x2,9)])

function y=f(x)

y=x^2/2-sin(x)-1;

function y=df(x)

y=x-cos(x);

第一种方法:利用dsolve函数求微分方程的符号解(通解):对于一些不是很难,要求出通解的微分方程,用dsolve函数求解。

1、 打开Matlab软件-->点击新建脚本菜单,新建一个脚本文件用于编写微分方程求解程序。

2、  输入微分方程求解程序-->点击保存-->点击运行。

3、在matlab的命令窗口即可看到求解结果,是一个关于参数a,b的表达式

第二种方法:利用Matlab中的solver函数(包括ode45、ode23、ode15s等)来求解微分方程的数值解,这种方法是最常用的方法,对于dsolve函数难以求解的方程就可以利用这种方法求解方程的数值解。

1、  打开Matlab-->新建一个脚本文件用于编写求解程序。

2、 在脚本文件中输入求解程序-->点击保存-->点击运行。

3、 这里需要先编写一个函数文件用于表示方程-->点击保存-->编写求解程序-->点击保存-->点击运行。

4、在figure页面就可以看到所求解的微分方程的图形。

以上就是关于求助:用Matlab编写最小二乘法程序 是关于二元一次方程的 y=ax1+bx2+c y=[a,b,c,d,e,f,g] x1=[a1,b1,c1,d1全部的内容,包括:求助:用Matlab编写最小二乘法程序 是关于二元一次方程的 y=ax1+bx2+c y=[a,b,c,d,e,f,g] x1=[a1,b1,c1,d1、求用MATLAB编制方程求根的二分法和Newton法的 Matlab 程序!!!谢谢~、matlab 代入法解方程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存