Yes, missing * is the problem. Thank you a lot. Do you mean I need to incorporate all expression of Rg0sq, Rg etc. into the final Pfit function?
Qiuyang Date: Sat, 11 Aug 2012 21:18:03 -0700 From: ml-node+s789695n4640077...@n4.nabble.com To: stephen...@hotmail.com Subject: Re: What's wrong with my code? stephenxqy wrote It is a complex function, functions are quoted frequently, you may read from bottom up The independent variable for final fit is q %%Rg0 is a function of L and b Rg0sq<-function(L,b)L*b/6*(1-3/2*b/L+3/2*(b/L)^2-3/4*(b/L)^3*(1-exp(-2*L/b))) %%alpha is a defined function alpha<-function(x)(1+(x/3.12)^2+(x/8.67)^3)^(0.176/3) %%w is a defined function w<-function(x)(1+tanh(x-1.523)/0.1477)/2 %%It is Rg^2 Rgsq<-function(L,b)(alpha(L/b)*Rg0sq(L,b)) %%This is Rg Rg<-function(L,b)(Rg0sq(L,b))^0.5 %%A debye function of q, the parameters are L and b PDebye<-function(L,b)2*(exp(-q^2*Rg0sq(L,b))+q^2*Rg0sq(L,b)-1)/q^4/(Rg0sq(L,b))^2 %%Another function of q that quote w, PDebye, Rg, parameters are v, L and b Pexv<-function(v,L,b)w(q*Rg(L,b))*PDebye(L,b)+(1-w(q*Rg(L,b)))(1.22*(q*Rg(L,b))^(-1/v)+0.4288*(q*Rg(L,b))^(-2/v)-1.651*(q*Rg(L,b))^(-1/v)) %%Another defined function cf<-function(L,b,pa,pb)pa/(L/b)^pb %%A function of q, quote Pexv, Rgsq, cf Psfcex<-function(v,L,b,pa,pb)Pexv(v,L,b)+cf(L,b,pa,pb)*b/L/15*(4+7/q^2/Rgsq(L,b)-(11+7/q^2/Rgsq(L,b))*exp(-q^2*Rgsq(L,b))) %%non-linear fit Pfit<-function(p)sum((I-Psfcex(p[1],p[2],p[3],p[4],p[5]))^2) wavefit<-nlm(Pfit,c(1.5,500,5,1,0.1),hessian=TRUE) error code: Error in c(1.5, 500, 5, 1, 0.1) : unused argument(s) (0.1) the fifth parameter is pb, which goes from Psfcex to cf, actually pa which only exist in cf is used, why not pb? 1. What language is this? # starts a comment line in R not %%. 2. no data for q 3. what is I in Pfit? 4. Pexv: missing * or + or ... The expression in the function Pexv should probably read w(q*Rg(L,b))*PDebye(L,b)+(1-w(q*Rg(L,b)))*(1.22*(q*Rg(L,b))^(-1/v)+0.4288*(q*Rg(L,b))^(-2/v)-1.651*(q*Rg(L,b))^(-1/v)) I have inserted * after (1-w(q*Rg(L,b))) assuming that is what you want. Your code is not reproducible since you have not provided data for q or I. Generating some random data and assuming I is an identity matrix with set.seed(123) q <- rnorm(20) + 5 I <- diag(length(q)) adding wavefit at the end of the script and changing the %% to # your script runs with no errors but with warnings. So I can't tell you why you get the error message you got. Finally: this is very inefficient code. There are repeated evaluations of same thing e.g. w(q*Rg(L,b)), Rg(L,b), Rg0sq(L,b) etc. Berend If you reply to this email, your message will be added to the discussion below: http://r.789695.n4.nabble.com/What-s-wrong-with-my-code-tp4640034p4640077.html To unsubscribe from What's wrong with my code?, click here. NAML -- View this message in context: http://r.789695.n4.nabble.com/What-s-wrong-with-my-code-tp4640034p4640086.html Sent from the R help mailing list archive at Nabble.com. [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.