关于matlab程序编写的一个问题
这是我写的求二次函数解的一个程序,运行出来的结果不对,想问下哪里写错了。a=input('enterthecoefficientA:');b=input('enterth...
这是我写的求二次函数解的一个程序,运行出来的结果不对,想问下哪里写错了。
a=input('enter the coefficientA:');
b=input('enter the coefficientB:');
c=input('enter the coefficientC:');
if (b^2-4*a*c)>0
x1=(-b+sqrt(b^2-4*a*c))/(2*a);
x2=(-b-sqrt(b^2-4*a*c))/(2*a);
disp('this question has two distinct real roots');
printf('x1 = %f\n', x1);
printf('x2 = %f\n', x2);
elaeif (b^2-4*a*c)==0
x1=(-b)/(2*a);
disp('this question has two identical real roots');
printf('x1=x2=%f\n',x1);
else (b^2-4*a*c)<0
disp('This equation has complex roots:');
end 展开
a=input('enter the coefficientA:');
b=input('enter the coefficientB:');
c=input('enter the coefficientC:');
if (b^2-4*a*c)>0
x1=(-b+sqrt(b^2-4*a*c))/(2*a);
x2=(-b-sqrt(b^2-4*a*c))/(2*a);
disp('this question has two distinct real roots');
printf('x1 = %f\n', x1);
printf('x2 = %f\n', x2);
elaeif (b^2-4*a*c)==0
x1=(-b)/(2*a);
disp('this question has two identical real roots');
printf('x1=x2=%f\n',x1);
else (b^2-4*a*c)<0
disp('This equation has complex roots:');
end 展开
2个回答
展开全部
楼上两位的回答都很用心,也很精彩,赞一个。
我的代码主要有以下优点:
(1)用稀疏矩阵存储a,克服内存不足问题(N取100万,使用的内存还不到20M)。
(2)绘图动态显示N次模拟过程中r/R的变化。
代码如下(同时已作为附件上传):
N = 1000000;M = 2*N;a = sparse(M+1, M+1);j = N + 1;k = N + 1;b = ceil(4*rand(1,N));% 绘图显示计算过程(为提高效率,每n次循环输出一个点)n = 500;v = zeros(1, fix(N/n)+1) * NaN;h = plot(1 : fix(N/n)+1, v, 'b-', NaN, NaN, 'ro');xlabel('N');ylabel('r/R');set(gcf, 'DoubleBuffer', 'on');set(gca, 'Xlim', [1 fix(N/n)+1]);t=ceil(exp(1:15));set(gca,'xtick',t/n,'xgrid','on','xticklabel',t)for i = 1:N switch b(i) case 1, j=j+1; a(j,k)=a(j,k)+1; case 2, k=k+1; a(j,k)=a(j,k)+1; case 3, j=j-1; a(j,k)=a(j,k)+1; case 4, k=k-1; a(j,k)=a(j,k)+1; end % 更新绘图 if ~rem(i, n) || i == N % 注意:不能用 sum(a(:)~=0) 进行计算,否则容易导致内存不足 R = full(sum(sum(a~=0))); c = fix(log(i)); r = full(sum(sum(a==c))); idx = fix(i/n) + 1; v(idx) = r/R; set(h(1), 'yData', v); set(h(2), 'xData', idx, 'yData', v(idx)); title(['N = ' int2str(i)]); drawnow endend% 输出结果fprintf('R=%i, r=%i, r/R=%.3g\n\n', R, r, r/R);% 统计各方向移动的次数(验证随机数的均匀性)for i = 1 : 4 fprintf('方向%i的次数为%i\n', i, sum(b==i));end
某次程序的输出如下:
R=204146, r=2856, r/R=0.014方向1的次数为249327方向2的次数为250179方向3的次数为250085方向4的次数为250409
简单说明几点:
1、由于是随机模拟,每次运行的结果都会有差别。
2、移动是一个前后关联的过程,所以随机数序列不仅要求均匀,还应该独立(相邻的随机数之间不相关)。
3、图中的虚线表示 int(ln(n)) 发生变化的N,计算格点次数变了,所以通常表现为不连续。
4、从图中的变化趋势看,没有收敛到某一个数的明显迹象,我运行两次的结果分别是0.0118和0.014。
5、在我的机器上,取N=100万,运行一次的时间大约是10分钟。
6、程序对MATLAB版本没有特别要求,在6.5、2008a、2012b上测试过,都可以正常运行。
我的代码主要有以下优点:
(1)用稀疏矩阵存储a,克服内存不足问题(N取100万,使用的内存还不到20M)。
(2)绘图动态显示N次模拟过程中r/R的变化。
代码如下(同时已作为附件上传):
N = 1000000;M = 2*N;a = sparse(M+1, M+1);j = N + 1;k = N + 1;b = ceil(4*rand(1,N));% 绘图显示计算过程(为提高效率,每n次循环输出一个点)n = 500;v = zeros(1, fix(N/n)+1) * NaN;h = plot(1 : fix(N/n)+1, v, 'b-', NaN, NaN, 'ro');xlabel('N');ylabel('r/R');set(gcf, 'DoubleBuffer', 'on');set(gca, 'Xlim', [1 fix(N/n)+1]);t=ceil(exp(1:15));set(gca,'xtick',t/n,'xgrid','on','xticklabel',t)for i = 1:N switch b(i) case 1, j=j+1; a(j,k)=a(j,k)+1; case 2, k=k+1; a(j,k)=a(j,k)+1; case 3, j=j-1; a(j,k)=a(j,k)+1; case 4, k=k-1; a(j,k)=a(j,k)+1; end % 更新绘图 if ~rem(i, n) || i == N % 注意:不能用 sum(a(:)~=0) 进行计算,否则容易导致内存不足 R = full(sum(sum(a~=0))); c = fix(log(i)); r = full(sum(sum(a==c))); idx = fix(i/n) + 1; v(idx) = r/R; set(h(1), 'yData', v); set(h(2), 'xData', idx, 'yData', v(idx)); title(['N = ' int2str(i)]); drawnow endend% 输出结果fprintf('R=%i, r=%i, r/R=%.3g\n\n', R, r, r/R);% 统计各方向移动的次数(验证随机数的均匀性)for i = 1 : 4 fprintf('方向%i的次数为%i\n', i, sum(b==i));end
某次程序的输出如下:
R=204146, r=2856, r/R=0.014方向1的次数为249327方向2的次数为250179方向3的次数为250085方向4的次数为250409
简单说明几点:
1、由于是随机模拟,每次运行的结果都会有差别。
2、移动是一个前后关联的过程,所以随机数序列不仅要求均匀,还应该独立(相邻的随机数之间不相关)。
3、图中的虚线表示 int(ln(n)) 发生变化的N,计算格点次数变了,所以通常表现为不连续。
4、从图中的变化趋势看,没有收敛到某一个数的明显迹象,我运行两次的结果分别是0.0118和0.014。
5、在我的机器上,取N=100万,运行一次的时间大约是10分钟。
6、程序对MATLAB版本没有特别要求,在6.5、2008a、2012b上测试过,都可以正常运行。
展开全部
4处错误!
a=input('enter the coefficientA:');
b=input('enter the coefficientB:');
c=input('enter the coefficientC:');
if (b^2-4*a*c)>0
x1=(-b+sqrt(b^2-4*a*c))/(2*a);
x2=(-b-sqrt(b^2-4*a*c))/(2*a);
disp('this question has two distinct real roots');
sprintf('x1 = %f\n', x1) % 1
sprintf('x2 = %f\n', x2)
elseif (b^2-4*a*c)==0 % 3
x1=(-b)/(2*a);
disp('this question has two identical real roots');
sprintf('x1=x2=%f\n',x1)
else (b^2-4*a*c)<0
disp('This equation has complex roots:');
end
a=input('enter the coefficientA:');
b=input('enter the coefficientB:');
c=input('enter the coefficientC:');
if (b^2-4*a*c)>0
x1=(-b+sqrt(b^2-4*a*c))/(2*a);
x2=(-b-sqrt(b^2-4*a*c))/(2*a);
disp('this question has two distinct real roots');
sprintf('x1 = %f\n', x1) % 1
sprintf('x2 = %f\n', x2)
elseif (b^2-4*a*c)==0 % 3
x1=(-b)/(2*a);
disp('this question has two identical real roots');
sprintf('x1=x2=%f\n',x1)
else (b^2-4*a*c)<0
disp('This equation has complex roots:');
end
更多追问追答
追问
sprintf和fprintf有什么区别?
追答
sprintf 返回字符串
fprintf 相当于 disp(sprintf(...))
另 else % (b^2-4*a*c)<0
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询