chenbinok 发表于 2010-11-6 16:39:53

可靠性分析中遇到的求导问题

下面是对一个由25杆组成的桁架进行可靠性分析的部分程序,因为在分析中我用的是“映射变化法”对桁架进行失效概率计算。但是在求导过程中没有目标函数,即不能用“diff”进行直接求导,所以我是引用子函数来求导,但总是出现问题,问题在下面已经标出。望各位老大帮忙给修改一下 ,小弟拜谢了。
function XBLMATLAB
clear;clc;
for i=1:21
    muX(i)=5.2e3;
    sigmaX(i)=0.26e3;
end
for i=22:25
    muX(i)=5.2e3;
    sigmaX(i)=0.2e3;
end
for i=18:21
    sLn(i)=sqrt(log(1+(sigmaX(i)/muX(i))^2));mLn(i)=log(muX(i))-sLn(i)^2/2;
end
for i=22:25
    aEv(i)=sqrt(6)*sigmaX(i)/pi;uEv(i)=-psi(1)*aEv(i)-muX(i);
end
aUn=;bUn=;
muX(27)=(aUn(1)+bUn(1))/2;sigmaX(27)=(bUn(1)-aUn(1))/sqrt(12);
muX(29)=(aUn(2)+bUn(2))/2;sigmaX(29)=(bUn(2)-aUn(2))/sqrt(12);
muX(26)=1779e3;
muX(28)=1779e3;
x=muX;
for i=1:29
    aa(i)=x(i)
end
fprintf(fid2,'%10.4f\r\n',aa)
fclose(fid2)
system('ansys100.exe -b -p ane3fl -i truss25.txt -o test.out')%功能函数值求解
fid3=fopen('result11.txt','r')
nline=0
while ~feof(fid3)
      tline=fgetl(fid3);
      nline=nline+1;
   if nline==29
         nnn=str2double(tline(16:28))
   end
end
fclose(fid3)
fprintf(fit,'%s\n','功能函数值g:')
fprintf(fit,'%10.4f\r\n',nnn)
fprintf(fit,'%s\n','=================')
for i=1:29
    gX=local_daoshu(x(i))       %这里开始调用子函数求解导数
end
%下面是调用的子函数....................................
function gX=local_daoshu(x)
         nnn2=local_func(m)
      gX=(nnn2-nnn)./(0.03*abs(x(i)))
%...................................................
functionnnn2=local_func(m)   %此子函数是求解nnn2值
    fid2=fopen('shuju.txt','wt')
    m(i)=x(i)+0.03*abs(x(i))
    for i=1:29               %这里一直出现错误(错误提示):"i" previously appeared to be used as a function or command, conflicting with its use here as the name of a variable.A possible cause of this error is that you forgot to initialize thevariable, or you have initialized it implicitly using load or eval.
      aa(i)=m(i)
    end
    fprintf(fid2,'%10.4f\r\n',aa)
    fclose(fid2)
    system('ansys100.exe -b -p ane3fl -i truss25.txt -o test.out')   %功能函数值求解(nnn2是通过ansys求解,因为这是一个由25个杆组成的桁架,因此没有目标函数。nnn2只是桁架中一个点的位移值,是通过ansys求解的)
    fid3=fopen('result.txt','r')
    nline=0
    while ~feof(fid3)
      tline=fgetl(fid3);
      nline=nline+1;
       if nline==29
          nnn2=str2double(tline(16:28))
       end
    end

qibbxxt 发表于 2010-11-6 18:25:10

很那想像,你这程序是怎么写出来的,在子函数中i没有定义,电脑也不知道i的数值是多少,所以出错了,如果你想要共享i的数值的话,建议你用nested function

lin2009 发表于 2010-11-6 21:11:40

functionnnn2=local_func(m)   %此子函数是求解nnn2值
    fid2=fopen('shuju.txt','wt')
    m(i)=x(i)+0.03*abs(x(i))
    for i=1:29               %这里一直出现错误(错误提示):"i" previously appeared to be used as a function or command, conflicting with its use here as the name of a variable.A possible cause of this error is that you forgot to initialize thevariable, or you have initialized it implicitly using load or eval.
      aa(i)=m(i)
    end
    fprintf(fid2,'%10.4f\r\n',aa)
    fclose(fid2)


1、 fid2=fopen('shuju.txt','wt')
打开数据文件后,怎么读取数据?
2、m(i)=x(i)+0.03*abs(x(i))
应该放在后面的循环体里面。
3、函数的返回值nnn2没有赋值。
4、没有把形参和实参区分开来。
.......

chenbinok 发表于 2010-11-7 09:21:35

3# lin2009
fid2=fopen('shuju.txt','wt')文件打开,是把aa值读到“shuju"文件中去,下面的程序在用ansys计算时调用“shuju”文件 。ansys算出的值就是赋给了nnn2

chenbinok 发表于 2010-11-7 09:28:05

2# qibbxxt
在主函数中就可以直接这样用,为什么子函数中不可以?i只是一个变量,在matlab中需要定义嘛? 是个新手,麻烦老大了

lin2009 发表于 2010-11-7 16:10:20

你的问题不仅仅是你标出来的。

for i=1:29
    aa(i)=x(i)
end
fprintf(fid2,'%10.4f\r\n',aa)
fclose(fid2)

fid2 前面根本就没有看到,你往哪里写入数据。

%下面是调用的子函数....................................
function gX=local_daoshu(x)
         nnn2=local_func(m)
      gX=(nnn2-nnn)./(0.03*abs(x(i)))

local_daoshu(x)中x为形参,gX=(nnn2-nnn)./(0.03*abs(x(i)))应改为gX=(nnn2-nnn)./(0.03*abs(x))
nnn 为与主函数共享的全局变量,但未申明!
nnn2 = local_func(m);此处的m为实参,但实际m未赋值!
另外有些语句“system('ansys100.exe -b -p ane3fl -i truss25.txt -o test.out')”他人机子上没办法运行,也没有相应的数据文件。
确实“很难想像,你这程序是怎么写出来的”-qibbxxt 。
这些都是基本概念的或基本的东西,求人不如求己。

liuchanghong 发表于 2010-11-16 22:28:12

建议你还是老老实实地采用数值微分算法求解好些,要不然就自己把导函数列出来,做为一个子函数调用。这是以前用FORTRAN编程的套路。
页: [1]
查看完整版本: 可靠性分析中遇到的求导问题