matlab中调用solve函数出错?怎么解决clc;clear all,close all;l=[20 50 100 200 500 1000 2000 5000 10000 20000 50000 100000 inf];for i=1:length(l)j=1for Re=linspace(4*10^3,10^7,100)t=solve('lambda-(-2*log10(2.51/Re/sqrt(lambda)+0.27/l(i)))^(-2)
来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/24 15:51:43
matlab中调用solve函数出错?怎么解决clc;clear all,close all;l=[20 50 100 200 500 1000 2000 5000 10000 20000 50000 100000 inf];for i=1:length(l)j=1for Re=linspace(4*10^3,10^7,100)t=solve('lambda-(-2*log10(2.51/Re/sqrt(lambda)+0.27/l(i)))^(-2)
matlab中调用solve函数出错?怎么解决
clc;
clear all,close all;
l=[20 50 100 200 500 1000 2000 5000 10000 20000 50000 100000 inf];
for i=1:length(l)
j=1
for Re=linspace(4*10^3,10^7,100)
t=solve('lambda-(-2*log10(2.51/Re/sqrt(lambda)+0.27/l(i)))^(-2) = 0','lambda')
lambda(j)=vpa(t,5)
j=j+1
end
semilogx(Re,log10(lambda)),hold on
end
xlabel('Reynolds number'),ylabel('log10(\lambda)');
tt=['d/k';'20';'50';'100';'200';'500';'1000';'2000';'5000';'10000';'20000';'50000';'100000';'\inf'];
gtext(tt);
matlab中调用solve函数出错?怎么解决clc;clear all,close all;l=[20 50 100 200 500 1000 2000 5000 10000 20000 50000 100000 inf];for i=1:length(l)j=1for Re=linspace(4*10^3,10^7,100)t=solve('lambda-(-2*log10(2.51/Re/sqrt(lambda)+0.27/l(i)))^(-2)
程序不算长,但问题可不少:
1、solve函数的这种调用方式:
solve('lambda-(-2*log10(2.51/Re/sqrt(lambda)+0.27/l(i)))^(-2) = 0','lambda')是把整个字符串作为参数传递给符号计算内核的,给参数l和Re赋值不起作用,所以在符号计算内核求解时会把l、Re也看成变量,从而导致求解失败.解决的办法是,定义符号变量lambda,然后把方程写成符号表达式从而代入l(i)、Re的值,再调用solve求解.
2、下面的写法
for Re=linspace(4*10^3,10^7,100)Re作为循环控制变量,每次只取一个值,后面用semilogx绘图时,Re只是一个标量.
3、使用vpa保留一定精度,得到的结果仍然是sym类型,不是数值类型,无法直接用于绘图.绘图时仍需要使用double将其转换成数值类型,这样vpa就显得没有太大必要了,直接调double就可以了.
4、方程中使用的函数log10是通过调用log2实现的,而log2对于sym对象并没有定义,所以,应该把log10(...)换成log(...)/log(10).
5、最后面的gtext不知道楼主想要实现什么效果,目前可以知道的是,tt的定义不正确,因为是把不同长度的字符串拼接成矩阵.如果是想显示图例,那么目前的代码也不可行,因为所有的线条风格都相同.我给改了一下,每个线条用一种随机颜色,然后显示legend.
6、其它还有一些小的细节,比如行尾是否用分号、循环过程中每次绘图之后是否刷新(不刷新则循环过程中无响应,容易被当成死机),请自行体会吧.
附修改后的代码和绘图结果:
clear Lambda Ll=[20 50 100 200 500 1000 2000 5000 10000 20000 50000 100000 inf];
for i=1:length(l)
j=1;
syms lambda
RE=linspace(4*10^3,10^7,100);
for Re=RE
t=solve(lambda-(-2*log(2.51/Re/sqrt(lambda)+0.27/l(i))/log(10))^(-2));
Lambda(j)=double(t);
j=j+1;
end
c = rand(1,3);
L{i} = sprintf('d/k = %g', l(i));
semilogx(RE,log10(Lambda),'color',c)
hold on, drawnow
end
xlabel('Reynolds number'),ylabel('log10(\lambda)');
legend(L{:},0)