1.
fzero()
2. fsolve()+ inline()
3. solve()
4. 先求解析解,后用替代法求数值解。
A=[sinxcosy, e^siny], B=[siny,1+e^(x/y)]
C=sqrt(A*B')-1
C(x,y)=0为隐函数
解:fzero是求一元方程根的函数,后面的1是初值,你也可以尝试其他的初值。"@ (x) @ (y)
表达式"是构造了一个双重匿名函数,传入x后就相当于一个关于y的一元函数了。关于这方面的详细讨论本人今年5、6月份将要出版的书:《MATLAB高效编程技巧与应用-30个案例分析》里有涉及。
这本质上就是一个参数传递的问题,匿名函数可以方便的实现参数传递,再复杂的还可以通过嵌套函数实现。就拿你5楼举的例子来说,起码有两个方法可以很好的解决:一个就是还用我4楼给你说的方法,只不过是构造两个匿名函数:
代码:
A =
@(x,y) [sin(x)*cos(y), exp(sin(y))];B = @(x,y)
[sin(y),1+exp(x/y)];
C = @(x) @(y) sqrt(A(x,y)*B(x,y)')-1;
Y = @(x) fzero(C(x),1)
Y =
@(x)fzero(C(x),1)
>> Y(1)
ans =
-8.4211e-018
>> Y(2)
ans =
-6.4283e-016
>> Y(3)
ans =
-7.2065e-016
还有一种就是先用符号计算把C的符号表达式算出来,然后再生成匿名函数:
代码:
syms x y
A = [sin(x)*cos(y),
exp(sin(y))];B
= [sin(y),1+exp(x/y)];
C = sqrt(A*B')-1;
eval_r(['fun = @(x) @(y)' ,char(C)]);
Y = @(x) fzero(fun(x),1)
fun =
@(x)@(y)(exp(sin(y))*(exp(conj(x)/conj(y))+1)+sin(conj(y))*cos(y)*sin(x))^(1/2)-1
Y =
@(x)fzero(fun(x),1)
>> Y(1)
ans =
-8.4211e-018
>> Y(2)
ans =
-6.4283e-016
>> Y(3)
ans =
-7.2065e-016
关于用MATLAB求解隐函数的问题
用MATLAB求解一个隐函数,x为待求值,其余均为已知参数,函数为(a+b*cos(c)-d*cos(e))/cos(x)=(f+b*sin(c)-d*sin(e))/sin(x)
解:如果Matlab 装了Symbolic
Toolbox的话,Matlab可以直接求解析解,如下:
solve('(a+b*cos(c)-d*cos(e))/cos(x)=(f+b*sin(c)-d*sin(e))/sin(x)',
'x')
ans =
-(log((a*exp(c*i)*exp(e*i) + b*exp(2*c*i)*exp(e*i) -
d*exp(c*i)*exp(2*e*i) + f*exp(c*i)*exp(e*i)*i)/(b*exp(e*i) -
d*exp(c*i) + a*exp(c*i)*exp(e*i) -
f*exp(c*i)*exp(e*i)*i))*i)/2
用subs函数可以将solve接出来的解析解里面的变量用数字替换掉,然后得到数值解。
举个简单的例子,求a*x=b的解,先求解析解,然后用a=2,b=1代入求出数值解:
>> solution=solve('a*x=b', 'x')
solution =
b/a
>> num_solution = subs(solution,
'[a,b]', [2 1])
num_solution =
1/2
>> num_solution =
subs(num_solution)
num_solution =
0.5000
qi=solve('qi-bet*detm/(bet/(B*0.018526^0.2*qi^0.6/di^0.6)+0.7*10^(-3)*2*ft/(ft+fi)/203+r0+1/aj)=0','qi')
其中除了qi外,其他参数的值都在前边的程序中算出来了,不知道是哪里出错了,运行总是出现Error using
==> solve
'
qi-bet*detm/(bet/(B*0.018526^0.2*qi^0.6/di^0.6)+0.7*10^(-3)*2*ft/(ft+fi)/203+r0+1/aj)=0
' is not a valid expression or equation.
不知道是不是solve不能调用前面的值,如何解决??
问题补充:
参数是和我输入的变量值有关的,会变化的,或者有没有其他的办法来解这个方程。
解:
>> a=3;
>> solve('a*x-3=0','x')
得到的结果是
ans =
3/a
也就是说,solve里面将a当成符号,而没有把你a=3代入。
试着改成
>> subs(solve('a*x-3=0','x'))
就得到ans=1的结果了。
你的问题也可以这样弄。
solve再加一个subs()
另外你也可以自己将方程中的变量先将值代入,然后再解方程
比如:
clear
>> a=3;
>> equ=sprintf('a*x-3=0');
>> equ=subs(equ); %这一步就是将a=3代入
>> solve(equ,x)
注意:
function y=fcn(a,b) %u is a vector
S=solve('a+b/r-z=1','r+z=38','r','z');
y=[S.r;S.z];//Embedded matlab function中得到多个变量值的方法