隐式函数matlab,matlab隐函数求解的几种方法

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中得到多个变量值的方法

  • 5
    点赞
  • 31
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值