lol 发表于 2008-7-8 09:40

函数求导循环计算语句

下面这段计算:
B1=;
B2=;
B3=;
B4=;
B5=;
B6=;
Z1=;
Z2=;
S=zeros(6,1);
for i=1:6
a1=B1(i,1);
a2=B2(i,1);
a3=B3(i,1);
a4=B4(i,1);
a5=B5(i,1);
a6=B6(i,1);
z1=Z1(i,1);
z2=Z2(i,1);
syms s
f=sym('(a1*sin(acos(-tan(z1-s)*tan(z2)))+a2*acos(-tan(z1-s)*tan(z2))+a3)*cos(s)+(a4*sin(acos(-tan(z1-s)*tan(z2)))-a5*acos(-tan(z1-s)*tan(z2)))*sin(s)+a6');
d=diff(f);
d=double(d);
d=subs(d,a1,B1(i+1,1));
d=subs(d,a2,B2(i+1,1));
d=subs(d,a3,B3(i+1,1));
d=subs(d,a4,B4(i+1,1));
d=subs(d,a5,B5(i+1,1));
d=subs(d,a6,B6(i+1,1));
d=subs(d,z1,Z1(i+1,1));
d=subs(d,z2,Z2(i+1,1));
%%定义精度,显示为小数
digits(4);
vpa(d);
solve('d=0','s');
S(i,1)=s;
end

出现问题如下:
??? Error using ==> eval
Undefined function or variable 'a1'.
Error in ==> sym.double at 45
D = reshape(eval(X),siz);

但是
>> a1
a1 =
   936
是正确的。

这些问题怎么解决呢?请教大家,这里先谢谢了 ^^

sigma665 发表于 2008-7-8 10:51

f=sym('(a1*sin(acos(-tan(z1-s)*tan(z2)))+a2*acos(-tan(z1-s)*tan(z2))+a3)*cos(s)+(a4*sin(acos(-tan(z1-s)*tan(z2)))-a5*acos(-tan(z1-s)*tan(z2)))*sin(s)+a6');
不能这样,引号内没法把a1等代入,用subs代

lol 发表于 2008-7-8 12:57

回复 2楼 的帖子

就是用下面的句子,想让数值代入的,但不能实现。
d=subs(d,a1,B1(i+1,1));
d=subs(d,a2,B2(i+1,1));
d=subs(d,a3,B3(i+1,1));
d=subs(d,a4,B4(i+1,1));
d=subs(d,a5,B5(i+1,1));
d=subs(d,a6,B6(i+1,1));
d=subs(d,z1,Z1(i+1,1));
d=subs(d,z2,Z2(i+1,1));

sigma665 发表于 2008-7-8 16:50

clear all;
clc;
B1=;
B2=;
B3=;
B4=;
B5=;
B6=;
Z1=;
Z2=;
S=zeros(6,1);
syms s a1 a2 a3 a4 a5 a6 z1 z2

for i=1:6
f=(a1*sin(acos(-tan(z1-s)*tan(z2)))+a2*acos(-tan(z1-s)*tan(z2))+a3)*cos(s)+(a4*sin(acos(-tan(z1-s)*tan(z2)))-a5*acos(-tan(z1-s)*tan(z2)))*sin(s)+a6;
d=diff(f,'s');
d=subs(d,a1,B1(i));
d=subs(d,a2,B2(i));
d=subs(d,a3,B3(i));
d=subs(d,a4,B4(i));
d=subs(d,a5,B5(i));
d=subs(d,a6,B6(i));
d=subs(d,z1,Z1(i));
d=subs(d,z2,Z2(i));
%%定义精度,显示为小数
    digits(6);
    vpa(d);
    ss=subs(solve(d));%%%问题在这
    S(i)=ss;
end


提示有漏解

sigma665 发表于 2008-7-8 16:52

你再看下help solve吧

The input to solve can be either symbolic expressions or strings. If eq is a symbolic expression (x^2-2*x+1) or a string that does not contain an equal sign ('x^2-2*x+1'), then solve(eq) solves the equation eq=0 for its default variable (as determined by findsym).

S =

    0.5806
   -0.2942
   -0.0343
    0.5187
    2.8570
   -6.2180

lol 发表于 2008-7-9 09:35

回复 5楼 的帖子

谢谢小西主任^^

我运行自己的语句每次到sovle那句都会卡住,运行您的也是在ss这句就卡住了,看不到结果。不知道为什么?

有漏解,可能是因为一个方程计算出来有2个解,那么S应该为6行2列,而前面定义的S只有6行1列。

关键是我现在不能完整的运行这些语句,求救。谢谢:)

sigma665 发表于 2008-7-9 10:27

回复 6楼 的帖子

我运行没问题啊我是2008a版本的

lol 发表于 2008-7-9 11:02

回复 5楼 的帖子

会不会是因为版本不同,所以我算不到结果呢?
我用的是7.0.0.19920 (R14) 版。

sigma665 发表于 2008-7-9 13:38

回复 8楼 的帖子

你先运行下帮助里的例子,能否得到正确解

lol 发表于 2008-7-9 15:22

回复 9楼 的帖子

运行帮助里的例子,可以得到正确解的。

hoyuxi411 发表于 2008-7-9 20:27

回复 楼主 的帖子

a1=B1(i,1);
a2=B2(i,1);
a3=B3(i,1);
a4=B4(i,1);
a5=B5(i,1);
a6=B6(i,1);
z1=Z1(i,1);
z2=Z2(i,1);
这一步运行完a1是数字啦。所以下面的句子语法是错误的。
d=subs(d,a1,B1(i+1,1));
我是这样觉得的。
页: [1]
查看完整版本: 函数求导循环计算语句