楼主: barbiezx
10837 4

[求助]请问如何把函数中的参数变量作为全局变量 [推广有奖]

  • 0关注
  • 0粉丝

学前班

80%

还不是VIP/贵宾

-

威望
0
论坛币
48 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
77 点
帖子
4
精华
0
在线时间
1 小时
注册时间
2007-6-5
最后登录
2011-9-21

楼主
barbiezx 发表于 2007-6-14 16:58:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

y<-rweibull(150,1,2) #产生weibull分布的随机数

n<-length(y)

kekaoxingfx<-function(y,r,ind,opt,opp)

{

allorder<-sort(y)

or<-allorder[1:r]

if(r>n)

list(fail="输入长度大于样本量,重新输入")

else{

B1<-a-0.789*qnorm(1-(1+opp)/2,0,1) *a/sqrt(n)

B2<-a+0.789*qnorm(1-(1+opp)/2,0,1)*a/sqrt(n)

S1<-b+1.053* qnorm(1-(1+opp)/2,0,1)*b/(sqrt(n)*a)

S2<-b-1.053* qnorm(1-(1+opp)/2,0,1)*b/(sqrt(n)*a)

if(ind==0){

data.frame(Beta=a,Sigma=b, Beta_left=B1, Beta_right=B2, Sigma_left=S1, Sigma_right=S2)

}

else {

R<-exp(-(opt/b)^a)

R1<-exp(-(opt/S1)^B2)

R2<-exp(-(opt/S2)^B1)

t<-S1*(log(1/opp)^B1)

if(opp==0.95) data.frame(R=R,R_left=R1, R_right=R2,t=t)

else data.frame(R=R,R_left =R1)

}

}

}

fun<-function(x) #二元二次方程

{

f<-c(sum(or)+x[1],2*sum(or)+x[2]) #想用上面的kekaoxingfx函数里的or,r

j<-matrix(c(1,0,0,1),nrow=2,byrow=T)

list(f=f,j=j)

}

newton<-function(fun,x,ep=1e-5,it_max=100) #牛顿迭代法解上述二元二次方程

{

index<-0;k<-1

while(k<=it_max)

{

x1<-x;obj<-fun(x)

x<-x-solve(obj$j,obj$f);

norm<-sqrt((x-x1)%*%(x-x1))

if(norm<ep)

{

Index<-1;break

}

k<-k+1

}

obj<-fun(x);

list(Beta=x[1], Sigma=x[2],it=k,index=index,funval=obj$f)

}

z<-newton(fun,c(-6,1))

a<-as.numeric(z[1]) #把向量强制转化成数

b<-as.numeric(z[2]) #把向量强制转化成数

kekaoxingfx(y,2,1,100,0.95)

报错说:错误在sum(or) : 找不到这个目标对象"or"

请大家帮帮我吧,我还是初学者,对r不是很熟。谢谢大家

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:求助 变量 函数 参数 全局

回帖推荐

yiyo900 发表于4楼  查看完整内容

function kekaoxingfx并没用上. 而且kekaoxing也没用上or. 2.要解决near singular matrix,可参考e-views user guide: 2)If the starting values are such that the derivatives are all zero, you will immediately see an error message indicating that encountered a “Near

amoybc 发表于2楼  查看完整内容

global variable assignmentor<<-allorder[1:r]a better way is using "list" to control the output of each function.

本帖被以下文库推荐

沙发
amoybc 发表于 2007-6-14 23:44:00
global variable assignment

or<<-allorder[1:r]

a better way is using "list" to control the output of each function.

已有 1 人评分论坛币 学术水平 热心指数 收起 理由
crystal8832 + 10 + 1 + 1 热心帮助其他会员

总评分: 论坛币 + 10  学术水平 + 1  热心指数 + 1   查看全部评分

Believe what you find it reasonable to believe

藤椅
barbiezx 发表于 2007-6-15 10:30:00

谢谢楼上的!

如果用牛顿迭代法解方程,r软件显示结果是:错误在drop(.Call("La_dgesv", a, as.matrix(b), tol, PACKAGE = "base")) :
系统计算上是奇异的: 倒条件数=0
此外: Warning messages:
1: 产生了NaNs in: log(x)
2: 产生了NaNs in: log(x)
3: 产生了NaNs in: log(x)
4: 产生了NaNs in: log(x)
5: 产生了NaNs in: log(x)

是不是初值取得不好?1——5个错误是不是因为x是负数呢?


板凳
yiyo900 发表于 2007-6-17 14:43:00

1.程序看来似乎有误:

function kekaoxingfx并没用上.

or只是将y sort,然后取1~r,不需放在kekaoxing内.

而且kekaoxing也没用上or.

fun看来不像二元二次方程.

2.要解决near singular matrix,可参考e-views user guide:

1)The objective function must be defined at the starting values. For example if the objective function contains LOG(C(1)), then C(1) must be greater than zero.

2)If the starting values are such that the derivatives are all zero, you will immediately see an error message indicating that encountered a “Near

Singular Matrix", and the estimation procedure will stop.

已有 1 人评分论坛币 学术水平 热心指数 收起 理由
crystal8832 + 10 + 1 + 1 热心帮助其他会员

总评分: 论坛币 + 10  学术水平 + 1  热心指数 + 1   查看全部评分

报纸
barbiezx 发表于 2007-7-5 15:33:00

谢谢。我把程序改了一下

y<-rweibull(150,1,2)

n<-length(y)

allorder<-sort(y)

r<-120

or<-allorder[1:r]

kekaoxingfx<-function(y,n,ind,opt,opp)

{

if(r>n)

list(fail="输入长度大于样本量,重新输入")

else{

B1<-a-0.789*qnorm(1-(1+opp)/2,0,1) *a/sqrt(n)

B2<-a+0.789*qnorm(1-(1+opp)/2,0,1)*a/sqrt(n)

S1<-b+1.053* qnorm(1-(1+opp)/2,0,1)*b/(sqrt(n)*a)

S2<-b-1.053* qnorm(1-(1+opp)/2,0,1)*b/(sqrt(n)*a)

if(ind==0){

data.frame(Beta=a,Sigma=b, Beta_left=B1, Beta_right=B2, Sigma_left=S1, Sigma_right=S2)

}

else {

R<-exp(-(opt/b)^a)

R1<-exp(-(opt/S1)^B2)

R2<-exp(-(opt/S2)^B1)

t<-S1*(log(1/opp)^B1)

if(opp==0.95) data.frame(R=R,R_left=R1, R_right=R2,t=t)

else data.frame(R=R,R_left =R1)

}

}

}

fun<-function(x) #解二元方程组

{

f<-c((sum(or^x[1]*(log(or)-log(x[2])))+(n-r)*allorder[r]^x[1]*(log(allorder[r]-log(x[2]))))/(r*x[2]^x[1])-1/r*sum(log(or))+log(x[2])-1/x[1],((sum(or^x[1])+ (n-r)*allorder[r]^x[1])/r)^(1/x[1])-x[2]) #二元方程组

j<-matrix(c((sum(or^x[1]*(log(or)-log(x[2]))*log(or))+ (n-r)*allorder[r]^x[1]*(log(allorder[r]-log(x[2])))*log(allorder[r])-( sum(or^x[1]*(log(or)-log(x[2])))+(n-r)*allorder[r]^x[1]*(log(allorder[r]-log(x[2])))*log(x[2])))/x[2]^x[1]*r+1/x[1]^2,(-sum(or^x[1])-(n-r) *allorder[r]^x[1]- (sum(or^x[1]*(log(or)-log(x[2])))+(n-r)*allorder[r]^x[1]*(log(allorder[r]-log(x[2]))))*x[1])/(r*x[2]^(x[1]+1))+1/x[2], ((sum(or^x[1])+ (n-r)*allorder[r]^x[1])/r)^(1/x[1])*log((sum(or^x[1])+ (n-r)*allorder[r]^x[1])/r)*(-1/x[1]^2)*(sum(or^x[1])*log(or)+(n-r)* allorder[r]^x[1]*log(or)) /r,-1),nrow=2,byrow=T) #雅克比行列式

list(f=f,j=j)

}

newton<-function(fun,x,ep=1e-5,it_max=100) #牛顿迭代法解上述二元方程组

{

index<-0;k<-1

while(k<=it_max)

{

x1<-x;obj<-fun(x)

x<-x-solve(obj$j,obj$f);

norm<-sqrt((x-x1)%*%(x-x1))

if(norm<ep)

{

Index<-1;break

}

k<-k+1

}

obj<-fun(x);

list(Beta=x[1], Sigma=x[2],it=k,index=index,funval=obj$f)

}

z<-newton(fun,c(1.32305,1.342913))

a<-as.numeric(z[1]) #把向量强制转化成数

b<-as.numeric(z[2]) #把向量强制转化成数

kekaoxingfx(y,150,1,100,0.95)

结果报错说:

错误在drop(.Call("La_dgesv", a, as.matrix(b), tol, PACKAGE = "base")) :
'a' (2 x 62)必需是正文形的
此外: Warning message:
数据长度[123] 不是矩阵行数[2] 的整倍数

请大家帮我看看,谢谢

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-19 06:05