在线等,matlab解一元三次方程写完代码运行出错,请求大神帮助纠错
syms x
L = 1:100;
for i=1:length(L)
x0 = solve('0.1125*tan(11*pi/36)*L(i)*x^3 - (tan(5*pi/36) + tan(pi/6))*(0.1125*tan(2*pi/9)*tan(11*pi/36)*L(i) + 1)*x^2 + (0.1125*tan(11*pi/36)*tan(5*pi/36)*tan(pi/6)*(tan(2*pi/9))^2*L(i) + 2*(tan(2*pi/9) - tan(5*pi/36)*tan(pi/6)*tan(2*pi/9)))*x - (tan(2*pi/9))^2*(tan(5*pi/36) + tan(pi/6)) = 0');
x0 = eval(x0);
if isreal(x0) & x0<2
x(i) = x0;
end
end
plot(L,x)
我的问题是:我想让matlab解完一元三次方程后,每一个L(从1到100)只对应一个x值,(该x值必须是正实数,如果三个解中如果只有一个实数根就取这个实数为解;如果三个解中有两个正实数根就取较小的)
另:我的代码中之所以后面在if中写x0<2,只是我猜测L变得越大,很有可能最小正实数根是一点多(即小于2),最好是能让matlab自己选较小正实数根,但是我不会。
最后,如果大神能够顺利画出L和较小根一一对应的曲线,小弟还想问问怎么能求出这条曲线上的最小值的坐标?
代码最后出错:Error using plot
Conversion to double from sym is not possible.
希望matlab大神能够帮帮忙,小弟初学matlab,代码中和所提问题可能都比较“傻”希望大神指点迷津,万分感激,(刚用百度知道,账户只有5分,还得用来提问抵押,实在抱歉了) 展开
先不说其他的事情啊,先说这里面的几个不对的地方:
plot 函数调用的时候,语法是这样的plot(x, y),其中x 和 y 必须要有相同的长度,在你的代码中,if isreal(x0),就表示你在100个循环中不一定能找出100个值和你的100个L对应。
所以一开始必须先初始化一个输出,我在这里先把它叫做xFinal,使用这样的语句,xFinal = zeros(100, 1),这样生成一个100行,一列,全是0的数组。这样就能起码保证你在plot的时候不会出错,说你的两个变量长度不等。
然后再往下说,你在为了解方程,把x定义成为了符号量 syms,这样你在plot的时候,就会报错说你的数据类型不对,其中一个是L,全部整数,另外一个是符号量,显然不对,所以我另外做了一个变量出来,就是刚刚说的xFinal。
你解出来的x0,可能是很多值,你要从中找出符合条件的,你的条件是小于2的实数。那么你这里就少了一个循环,你必须把x0里面的值也都找一遍,才能出结果。
我给你改完的代码是这样的:
syms x
L = 1:100;
xFinal = zeros(100, 1);
for i=1:length(L)
x0 = solve('0.1125*tan(11*pi/36)*L(i)*x^3 - (tan(5*pi/36) + tan(pi/6))*(0.1125*tan(2*pi/9)*tan(11*pi/36)*L(i) + 1)*x^2 + (0.1125*tan(11*pi/36)*tan(5*pi/36)*tan(pi/6)*(tan(2*pi/9))^2*L(i) + 2*(tan(2*pi/9) - tan(5*pi/36)*tan(pi/6)*tan(2*pi/9)))*x - (tan(2*pi/9))^2*(tan(5*pi/36) + tan(pi/6)) = 0');
x0 = eval(x0);
for j = 1:numel(x0)
if (isreal(x0(j)) && x0(j)<2)
xFinal(i) = x0(j);
end
end
end
plot(L,xFinal)
在下面就是输出结果
PS: 加分加财富真心不需要,只要上面的内容有帮助就可以了。