[已解决] 在使用fsolve解多元非线性方程的时候,出现FSOLVE requires all values returned by user functions to be of data type double.

[复制链接]
littleboat007 发表于 2022-11-16 22:00:58
我的定义函数为:
function R = R10d(B1,B2,B3,B4,B5,B6,B7,B8,C3, C4)
syms  B1 B2 B3 B4 B5 B6 B7 B8  C3 C4
km=33.55;
kb= 2;
Ef= 8.3;
If=7.95;
C1=0;
C2=0;


m=(km/(4*Ef*If))^(1/4);
b = ((km + kb)/(4*Ef*If))^(1/4);


R(1)= -2*Ef*If*m^3*(B2 - B3);

R(2)= B1*cos(100*m)*cosh(100*m) + B2*cosh(100*m)*sin(100*m) + B3*cos(100*m)*sinh(100*m) + B4*sin(100*m)*sinh(100*m)-1;

R(3)= B5*cos(100*m)*cosh(100*m) + B6*cosh(100*m)*sin(100*m) + B7*cos(100*m)*sinh(100*m) + B8*sin(100*m)*sinh(100*m)-1;

R(4)= m*(2*B1*((cos(100*m)*sinh(100*m))/2 - (cosh(100*m)*sin(100*m))/2) + B2*(B3*(cos(100*m)*cosh(100*m) - sin(100*m)*sinh(100*m)) + 2*B4*((cos(100*m)*sinh(100*m))/2 + (cosh(100*m)*sin(100*m))/2) + cos(100*m)*cosh(100*m) + sin(100*m)*sinh(100*m))) - m*(B6*(cos(100*m)*cosh(100*m) + sin(100*m)*sinh(100*m)) + B7*(cos(100*m)*cosh(100*m) - sin(100*m)*sinh(100*m)) + 2*B5*((cos(100*m)*sinh(100*m))/2 - (cosh(100*m)*sin(100*m))/2) + 2*B8*((cos(100*m)*sinh(100*m))/2 + (cosh(100*m)*sin(100*m))/2));

R(5)= 2*Ef*If*m^2*(B8*cos(100*m)*cosh(100*m) + B6*cos(100*m)*sinh(100*m) - B7*cosh(100*m)*sin(100*m) - B5*sin(100*m)*sinh(100*m)) - 2*Ef*If*m^2*(B4*cos(100*m)*cosh(100*m) + B2*cos(100*m)*sinh(100*m) - B3*cosh(100*m)*sin(100*m) - B1*sin(100*m)*sinh(100*m));

R(6)= B5*cos(101*m)*cosh(101*m) + B6*cosh(101*m)*sin(101*m) + B7*cos(101*m)*sinh(101*m) + B8*sin(101*m)*sinh(101*m);

R(7)= C1*(cos(101*b)*cosh(101*b) + cos(101*b)*sinh(101*b)) + C3*(cos(101*b)*cosh(101*b) - cos(101*b)*sinh(101*b)) + C2*(cosh(101*b)*sin(101*b) + sin(101*b)*sinh(101*b)) + C4*(cosh(101*b)*sin(101*b) - sin(101*b)*sinh(101*b));

R(8)= m*(B6*(cos(101*m)*cosh(101*m) + sin(101*m)*sinh(101*m)) + B7*(cos(101*m)*cosh(101*m) - sin(101*m)*sinh(101*m)) + 2*B5*((cos(101*m)*sinh(101*m))/2 - (cosh(101*m)*sin(101*m))/2) + 2*B8*((cos(101*m)*sinh(101*m))/2 + (cosh(101*m)*sin(101*m))/2)) - b*(C2*(cos(101*b)*cosh(101*b) + cos(101*b)*sinh(101*b) + cosh(101*b)*sin(101*b) + sin(101*b)*sinh(101*b)) + C1*(cos(101*b)*cosh(101*b) + cos(101*b)*sinh(101*b) - cosh(101*b)*sin(101*b) - sin(101*b)*sinh(101*b)) - C3*(cos(101*b)*cosh(101*b) - cos(101*b)*sinh(101*b) + cosh(101*b)*sin(101*b) - sin(101*b)*sinh(101*b)) + C4*(cos(101*b)*cosh(101*b) - cos(101*b)*sinh(101*b) - cosh(101*b)*sin(101*b) + sin(101*b)*sinh(101*b)));

R(9)= 2*Ef*If*b^2*(C2*(cos(101*b)*cosh(101*b) + cos(101*b)*sinh(101*b)) - C4*(cos(101*b)*cosh(101*b) - cos(101*b)*sinh(101*b)) - C1*(cosh(101*b)*sin(101*b) + sin(101*b)*sinh(101*b)) + C3*(cosh(101*b)*sin(101*b) - sin(101*b)*sinh(101*b))) - 2*Ef*If*m^2*(B8*cos(101*m)*cosh(101*m) + B6*cos(101*m)*sinh(101*m) - B7*cosh(101*m)*sin(101*m) - B5*sin(101*m)*sinh(101*m));

R(10)= 2*Ef*If*m^3*(C2*(cos(101*b)*cosh(101*b) + cos(101*b)*sinh(101*b) - cosh(101*b)*sin(101*b) - sin(101*b)*sinh(101*b)) - C1*(cos(101*b)*cosh(101*b) + cos(101*b)*sinh(101*b) + cosh(101*b)*sin(101*b) + sin(101*b)*sinh(101*b)) + C3*(cos(101*b)*cosh(101*b) - cos(101*b)*sinh(101*b) - cosh(101*b)*sin(101*b) + sin(101*b)*sinh(101*b)) + C4*(cos(101*b)*cosh(101*b) - cos(101*b)*sinh(101*b) + cosh(101*b)*sin(101*b) - sin(101*b)*sinh(101*b))) - 2*Ef*If*m^3*(B6*(cos(101*m)*cosh(101*m) - sin(101*m)*sinh(101*m)) - B7*(cos(101*m)*cosh(101*m) + sin(101*m)*sinh(101*m)) - 2*B5*((cos(101*m)*sinh(101*m))/2 + (cosh(101*m)*sin(101*m))/2) + 2*B8*((cos(101*m)*sinh(101*m))/2 - (cosh(101*m)*sin(101*m))/2));

end


计算为:


[size=13.3333px]fun = @R10d;
[size=13.3333px]x0 = [0,0,0,0,0,0,0,0,0,0,0];

[size=13.3333px]options=optimoptions('fsolve','display','iter');

[size=13.3333px]x = fsolve(fun,x0,options)

[size=13.3333px]

[size=13.3333px]出现:
[size=13.3333px]

[size=13.3333px]FSOLVE requires all values returned by functions to be of data type double.
[size=13.3333px]

[size=13.3333px]该如何解决?






最佳答案


TouAkira 发表于 2022-11-17 10:25:52
littleboat007 发表于 2022-11-16 21:47
大佬,可是我去掉syms B1 B2 B3 B4 B5 B6 B7 B8  C3 C4之后提示输入参数的数目不足,这是该怎么办呢?而 ...

照着2楼改呀,我都写给你了
function R = R10d( Input )
而不是你原来的
function R = R10d(B1,B2,B3,B4,B5,B6,B7,B8,C3, C4)

6 条回复


TouAkira 发表于 2022-11-17 07:56:51
语法有问题。MATLAB不是c语言等必须先声明一个变量才能接着使用的语言,尤其是数值计算时,不要画蛇添足写syms  B1 B2 B3 B4 B5 B6 B7 B8  C3 C4  这种语句。
function R = R10d( Input )
B1 = Input( 1 );
B2 = Input( 2 );
B3 = Input( 3 );
B4 = Input( 4 );
B5 = Input( 5 );
B6 = Input( 6 );
B7 = Input( 7 );
B8 = Input( 8 );
C3 = Input( 9 );
C4 = Input( 10 );
km=33.55; % 删掉syms声明。后面照抄

littleboat007 发表于 2022-11-17 09:47:08
TouAkira 发表于 2022-11-17 07:56
语法有问题。MATLAB不是c语言等必须先声明一个变量才能接着使用的语言,尤其是数值计算时,不要画蛇添足写s ...

大佬,可是我去掉syms B1 B2 B3 B4 B5 B6 B7 B8  C3 C4之后提示输入参数的数目不足,这是该怎么办呢?而且B1 B2 B3 B4 B5 B6 B7 B8  C3 C4这几个是要求的未知变量,无法输入,只有
km=33.55;
kb= 2;
Ef= 8.3;
If=7.95;
C1=0;
C2=0;
几个才是已知的,可以通过input输入

TouAkira 发表于 2022-11-17 10:25:52
littleboat007 发表于 2022-11-16 21:47
大佬,可是我去掉syms B1 B2 B3 B4 B5 B6 B7 B8  C3 C4之后提示输入参数的数目不足,这是该怎么办呢?而 ...

照着2楼改呀,我都写给你了
function R = R10d( Input )
而不是你原来的
function R = R10d(B1,B2,B3,B4,B5,B6,B7,B8,C3, C4)
回复此楼

littleboat007 发表于 2022-11-17 19:55:45
TouAkira 发表于 2022-11-17 10:25
照着2楼改呀,我都写给你了
function R = R10d( Input )
而不是你原来的

感谢大佬,做出来了,不过这个初始值实在是太难定了,我打算试试1stopt

爱玲玲 发表于 2022-11-17 21:34:15
你好,方便留个联系方式吗

Joycelin 发表于 2022-11-22 19:14:24
:)::):):):):)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表