24小时热门版块排行榜    

Znn3bq.jpeg
北京石油化工学院2026年研究生招生接收调剂公告
查看: 2628  |  回复: 5
【悬赏金币】回答本帖问题,作者dsmj1995将赠送您 10 个金币

dsmj1995

铜虫 (小有名气)

[求助] 请教如何提高MATLAB函数norminv(p,0,1)的使用精度

请教各位大佬一个MATLAB问题:如何提高函数norminv(p,0,1)的使用精度?
norminv为一维正态分布的累积分布函数的逆函数,假设 p = 1-10^(i) , i = 1,...,.N, 因为matlab的运算精度为双精度16位有效数字 ,因此当N>16的时候,norminv(p,0,1)返回的都是正无穷大。现在编程涉及到的p比较小,所以想请教一下如何使得p<1-10^16时,也能使得该函数得出较为准确的结果?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

kingspin

木虫 (著名写手)


独孤神宇: 金币+1, 鼓励交流 2020-09-07 08:20:11
做数值计算的第一步就应该是把问题归一化,从而在计算质量最高的范围求解

发自小木虫IOS客户端
欢迎加入Digimat技术交流讨论群366061054,了解复合材料多尺度仿真技术
2楼2020-08-29 20:16:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dsmj1995

铜虫 (小有名气)

该问题已经解决。实际上,我本来的目的是为生成服从左截断的正态分布变量,X~N(mu,sigma,u-), 式中mu,sigma为标准正态变量的均值与方差,u-为左截断的位置。通常的的方法是生成均匀分布变量 p~U(p1,1),其中p1 = normcdf(u-,mu,sigma),然后再根据正态函数的累积分布函数将p1转化目标的截断正态分布变量X, 即是X = norminv(p1,mu,sigma)。其中normcdf,norminv都是MATLAB内置函数,分别是正态分布函数的累积分布函数与其逆函数。这种做法在u-与mu比较接近的时候,效率还是可以的。但是当u->>mu,即是p1非常接近于1,如同我在帖子中所描述的问题,由于数值计算的精度所限制这种做法是行不通的。

关于当p1非常接近于1时,对应的逆函数值的求解问题,我在链接上 https://www.mathworks.com/matlab ... ty-is-close-to-zero 看到两种解决方法:一种是在MATLAB采用符号变量sym,一种是通过迭代的方法。这里不再赘述。下面说我的问题怎么解决,相应的MATLAB代码如下:

Beta = u-;即是上面问题描述的截断的位置
% % method#1:经典方法
U1 = rand(1);
X = norminv(U1+(1-U1).*normcdf(Beta));
% % method#2: 采用matlab的sym变量
U1 = rand(1);
p = (U1+(1-U1).*(1-sym(normcdf(Beta,'upper'))));
X = double(norminv(p));
% % method#3:文献链接https://arxiv.org/pdf/0907.4010.pdf,提供了一种采用平动指数分布函数作为抽样函数的Accept-Reject模拟方法,根据此编制了MATLAB函数 LeftTruncatedNormrnd
X = LeftTruncatedNormrnd(Beta,Ns);,
3楼2020-09-06 14:14:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dsmj1995

铜虫 (小有名气)

编制的MATLBA函数 LeftTruncatedNormrnd及其验证代码如下,经过验证感觉这种方法还不错。有路过大佬或虫友如果觉得有什么不对,或者更高效的方法,还请多指教。

主函数:
function [X,accept_rate] = LeftTruncatedNormrnd(ul,Ns)

alpha = (ul+sqrt(ul^2+4))/2;
Ns_accept = 0;

while Ns_accept==0
% 1. Generate translated exponential distribution
Z = exprnd(1/alpha,Ns,1)+ul;

% 2. Compute coeffcient of accept rate
po = exp(-(Z-alpha).^2/2);

% 3. Accept or reject
U = rand(Ns,1);
index = find(U<=po);
X = Z(index,1);

% 4. other
Ns_accept = length(index);
accept_rate = Ns_accept/Ns;
end

return

验证代码:
xc_max = max(X);
xc = ulxc_max-ul)/1000:xc_max;
dx = xc(2)-xc(1);
n1 = hist(X,xc);

pdf_sim = n1/Ns_accept/dx;
pdf_norm = normpdf(xc,0,1)/normcdf(ul,'upper');

plot(xc,pdf_sim)
hold on
plot(xc,pdf_norm)
4楼2020-09-06 14:18:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dsmj1995

铜虫 (小有名气)

代码中哭脸:( 为 ‘:’ + '(',请自行替换,比较少发帖,还请见谅
5楼2020-09-06 14:20:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dsmj1995

铜虫 (小有名气)

引用回帖:
4楼: Originally posted by dsmj1995 at 2020-09-06 14:18:34
编制的MATLBA函数 LeftTruncatedNormrnd及其验证代码如下,经过验证感觉这种方法还不错。有路过大佬或虫友如果觉得有什么不对,或者更高效的方法,还请多指教。

主函数:
function  = LeftTruncatedNormrnd(ul, ...

验证代码更正,需先保存主函数LeftTruncatedNormrnd:

ul = 2
Ns = 1e5;
% method#1
% U1 = rand(Ns,1);
% X = norminv(U1+(1-U1).*normcdf(ul));
% % % method#2
% U1 = rand(Ns,1);
% p = (U1+(1-U1).*(1-sym(normcdf(ul,'upper'))));
% X = double(norminv(p));
% % method#3
[X,accept_rate] = LeftTruncatedNormrnd(ul,Ns);

close all
xc_max = max(X);
xc = ulxc_max-ul)/1000:xc_max;
dx = xc(2)-xc(1);
n1 = hist(X,xc);

pdf_sim = n1/(Ns*accept_rate)/dx;
pdf_norm = normpdf(xc,0,1)/normcdf(ul,'upper');

plot(xc,pdf_sim)
hold on
plot(xc,pdf_norm)
legend('sim','target')
6楼2020-09-06 14:48:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 dsmj1995 的主题更新
不应助 确定回帖应助 (注意:应助才可能被奖励,但不允许灌水,必须填写15个字符以上)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 273求调剂 +36 麦小叮当 2026-04-06 43/2150 2026-04-08 01:20 by 1018329917
[考研] 304求调剂 +9 素年祭语 2026-04-06 12/600 2026-04-08 00:04 by JourneyLucky
[考研] 机械调剂 +3 zzzbcb 2026-04-07 3/150 2026-04-07 22:19 by hemengdong
[考研] 306求调剂 +3 15287505595 2026-04-03 3/150 2026-04-07 18:08 by 蓝云思雨
[考研] 307分材料专业求调剂 +9 Hll胡 2026-04-05 9/450 2026-04-07 16:41 by daiee
[考研] 化学调剂求助 +8 LULONG1 2026-04-03 8/400 2026-04-06 10:26 by dongzh2009
[考研] 调剂 一志愿吉林大学357分 +5 .Starry. 2026-04-04 5/250 2026-04-06 09:28 by cql1109
[考研] 化学0703-一志愿211-338分求调剂 +8 vants 2026-04-05 8/400 2026-04-06 06:17 by houyaoxu
[考研] 求调剂 +10 Hll胡 2026-04-04 10/500 2026-04-05 20:09 by nepu_uu
[考研] 0854求调剂 +4 assdll 2026-04-04 4/200 2026-04-05 09:44 by zhq0425
[考研] 266分,一志愿电气工程,本科材料,求材料专业调剂 +11 哇呼哼呼哼 2026-04-01 12/600 2026-04-04 23:17 by 永字号
[考研] 341求调剂 +3 洛多罗 2026-04-02 4/200 2026-04-04 21:36 by 智能智慧
[考研] [调剂信息]085408光电信息 求调剂 总分291分数一英一 +3 iz11az 2026-04-02 3/150 2026-04-04 19:09 by 蓝云思雨
[考研] 材料383求调剂 +5 郭阳阳阳成 2026-04-04 5/250 2026-04-04 19:06 by dongzh2009
[考研] 一志愿东北大学085901土木专硕345求调剂 +3 zxt11111 2026-04-04 3/150 2026-04-04 14:21 by 土木硕士招生
[考研] 297求调剂 +11 ljy20040718! 2026-04-03 13/650 2026-04-04 09:23 by 来看流星雨10
[考研] 081200-11408-276学硕求调剂 +5 崔wj 2026-04-03 5/250 2026-04-03 15:06 by arrow8852
[考研] 农学考研求调剂 +3 dkdkxm 2026-04-01 3/150 2026-04-02 16:04 by wangjagri
[考研] 283求调剂 +3 jiouuu 2026-04-02 4/200 2026-04-02 14:08 by 哒哒哒呱呱呱
[考研] 279求调剂 +7 莫xiao 2026-04-01 7/350 2026-04-01 22:05 by 客尔美德
信息提示
请填处理意见