MATLAB fsolve函数调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB fsolve函数调用相关的知识,希望对你有一定的参考价值。
本人编制的如下程序求解:
function k=yupian(q,S0,l,h)
% 求空缆状态下主索鞍的预偏量YP和此时的主缆水平力H
% k=yupian(45,[818.48,291.88],[800,280],85)
% q=45;S0=[818.48,291.88];l=[800,280];h=85;
r0=[q*l(1)^2/(4*h),1.0];
function y=hyps(r)
% 通过索的形状长度s求垂度f的方法。
H=r(1);
yp=r(2);
EA=1.0e+8;
c=[0,h];
l(1)=l(1)+2*yp;
l(2)=l(2)-yp;
f=q*l.^2/8/H;
c1=(c+4*f)./l;
c2=(c-4*f)./l;
y=l.^2./(16*f).*(c1.*sqrt(1+c1.^2)-c2.*sqrt(1+c2.^2)+log(c1+sqrt(1+c1.^2))-log(c2+sqrt(1+c2.^2)))-H/EA*l.*(1+(c.^2+16*f.^2-16*c.*f)./l.^2)-S0;
end
r0=[4.5e+4,1.0];
options=optimset('Display','off','TolFun',1e-10); %设置计算精度并关闭显示
k=fsolve(@hyps,[4.5e+4,1.0],options); %用抛物线法求近似垂度
end
输出结果为:
k =
1.0e+004 *
4.5000 0.0001
问题是:用这个程序得到的怎么是迭代初值?
clear
a=[];
x0=1;x1=5;
for i=x0:0.1:x1 %限定区间,步长为0.1
x = fsolve(@(x) sin(3*x),i,optimset('Display','off')); %求出一个根
flag=0; %检查是否已经存在在根集中
for j=1:length(a)
if abs(x-a(j))<=1e-4
flag=1; %已经存在
break;
end
end
if flag==0 %没有存在
a=[a,x];
end
end
for j=length(a):-1:1
if a(j)>x1||a(j)<x0
a(j)=[];
end
end
a
求解的结果为:
a =
1.0472 2.0944 3.1416 4.1888本回答被提问者采纳
使用Matlab fsolve()通过2个变量找到2个函数的零点
我使用Matlab试图用2个变量求解2个方程。
我定义了两个函数,f2(n_1,n_2),f3(n_1,n_2),它们都依赖于f1(n_1,n_2),然后我定义了包含它们的向量化函数G(n_1,n_2)。
后来我定义了一个理想的说明点,并尝试解决。但是在运行代码时会引发一个我不完全理解的错误。
上面提到的代码显示在下面的代码中:
代码:
clear, close all; clc
%Const
N0=25;
G1=1;G2=1;
a1=6;a2=3;
k1=1;k2=4;
%main
syms n_1 n_2
X_0=[-5;5];
f1=N0-a1.*n_1-a2.*n_2;
f2=f1.*G1.*n_1-k1.*n_1;
f3=f1.*G2.*n_2-k2.*n_2;
G=@(n_1,n_2) [f2;f3];
s = fsolve(G,X_0);
错误:
Error using fsolve (line 269)
FSOLVE requires all values returned by functions to be of data type double.
Error in Ex1_Q3_DavidS (line 37)
s = fsolve(G,X_0);
谢谢
fsolve
是一个使用数值方法查找数值函数根的函数。
数值函数是例如f=@(x)x^2=2;
。在MATLAB中,您可以在任何数字上评估f()
,它将返回一个数字,但没有更高阶的数学抽象。然而,这是在计算机中进行数学运算的最快方法,因为它不是一个更高的智能,只是一个美化的计算器。
然而,有些人想要给计算机提供更高的智能,并编码非常复杂的符号工具箱,这些工具箱通过一系列规则试图教会计算机思考半人类并解决符号方程,正如你在纸上所做的那样。为了解决这些方程,在MATLAB中引入了一个名为solve
的函数。
你正在做符号数学,但使用数字解算器。它不起作用,只需使用符号解算器进行符号数学运算。
以上是关于MATLAB fsolve函数调用的主要内容,如果未能解决你的问题,请参考以下文章