作业帮 > 综合 > 作业

matlab中调用solve函数出错?怎么解决

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/05/01 19:52:44
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);
程序不算长,但问题可不少: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 L
l=[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)