EDA365电子论坛网

标题: 使用matlab中的fsolve求解非线性方程时报错 [打印本页]

作者: peerless2021    时间: 2023-2-7 15:47
标题: 使用matlab中的fsolve求解非线性方程时报错
本帖最后由 peerless2021 于 2023-2-7 15:48 编辑
% p& A# {2 e: J5 u' s2 r. \7 l& p1 k6 ?
8 I3 Y$ i& c5 F# z原程序为在调用时会报错截图如下:+ B8 D9 Y+ r0 g* ~$ ]2 }/ F

- `. @4 ?0 ^2 h  W( c原方程比较复杂,如图:5 x& @# f1 r3 m: x; [) Z

" V% f+ f7 s% A
是调用的方式出现了问题吗?
4 r! C/ K5 b+ g! A

2 T/ F8 @  ?- D) Y' U( f" |+ ~8 |0 l" p; |6 U

作者: aid4her    时间: 2023-2-7 16:37
你这样写不符合 fsolve函数(超链接,自己点进去看) 的语法要求。0 t- L9 d+ v# z3 e2 j
仔细看帮助文档里的示例,以 x = fsolve(@myfun,x0) 这种语法调用时,要求输入函数形为 function F = myfun(x) 这样的“单输入”函数,你有两个输入,当然不行了。要么改写为
1 W% @1 ^; ]; B+ ufunction F = myeqn( Input )
. i8 X/ D9 S$ r+ {7 _0 Y/ B+ Palpha = Input( 1 );0 J! {3 L/ Y' A& d3 s
L = Input( 2 );7 Q0 g: s/ i$ A/ [+ A
F = (0.3*((9.8)*L^1.83)/(2*cos(alpha)^2)+(1.96*L^3)/(3*cos(alpha)^3)-10)/(0.9*tan(alpha));$ s* T" T& _3 f/ r
end8 {9 u- S# s  X" H6 z
这样的“单输入”,然后用 x0 = [ alpha0, L0 ]; x = fsolve( @myeqn, x0 ) 来求“满足方程的数值向量”(另外还得注意你这初值取得不合适,导致分母出现了零,新手要避免直接取全零或全1这种简单值作为初值,很容易导致各种无穷或零出现在分母之类位置上,导致迭代运算无法继续)
* W  }  _  v, s; x. N9 x/ P% j9 O要么不改动自定义函数,但需要另行指定一个输入的值,求另一个,需要改写为7 |& {7 h# a" l6 e' O; a2 I
x0 = [ alpha0 ] + eps; % 避免初值无效
) m8 x2 A3 U) R$ m: M6 O# }x = fsolve( @( t ) myeqn( t, L0 ), x0 ), N, Q5 g: `$ ^: O+ {
disp( myeqn( x, L0 ) )
/ M. P* A* i8 T& G4 t9 P/ I" S最后,你得好好检查检查你的函数,你为什么要多此一举地把 0.9*tan(alpha) 扔到分母上去。原方程是7 p) t1 A+ r% G- U! S
0 == 0.9*tan(alpha) + Others6 ~8 W; H% R  Y2 T) G+ E
怎么你改写就成了 0 == Others / ( 0.9*tan(alpha) ) 了?
作者: peerless2021    时间: 2023-2-7 16:45
aid4her 发表于 2023-2-7 16:37
- }8 ~4 s% d9 t% k1 |你这样写不符合 fsolve函数(超链接,自己点进去看) 的语法要求。
7 }" k1 J6 a& G) [仔细看帮助文档里的示例,以 x = fsolv ...

) N* H7 J9 A. \2 J是的,我的函数搞错了,是我打的时候想多了。按照您的两个方式我都尝试了一下,程序可以正常运行了,但是我没明白是在哪一步修改初值,最后得到的结果数字都是没输入过的
* C' R% x! \. h




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2