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

发布网友 发布时间:2022-04-23 15:28

我来回答

1个回答

热心网友 时间:2023-09-15 12:44

程序不算长,但问题可不少:

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)

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com