求解初值问题是求什么一下问题代码

考虑基追踪问题:这里使用内层循环为近似点梯度法的增广拉格朗日函数法对其进行求解。 引入罚因子
和乘子 ,则增广拉格朗日函数为对

进行迭代。目录构造基追踪问题设定随机种子。clear;
seed = 97006855;
ss = RandStream('mt19937ar','Seed',seed);
RandStream.setGlobalStream(ss);
构造基追踪问题,
为问题的真实解(其稀疏度为 ),使得 ,
为随机的迭代初始点。m = 512;
n = 1024;
A = randn(m, n);
u = sprandn(n, 1, 0.1);
b = A * u;
x0 = randn(n, 1);
参数设定。opts.verbose = 0;
opts.gamma = 0.85;
opts.itr = 7;
求解基追踪问题调用算法 BP_ALM 求解 BP 问题。[x, out] = BP_ALM(x0, A, b, opts);
k1 = out.itr + 1;
记录等式约束的违反度。data1 = out.feavec(1:k1);
计算并存储迭代点距离最优点的距离。tmp = [x0,out.itervec(:,1:k1-1)] - u*ones(1,k1);
tmp2 = sum(tmp.*tmp);
data2 = sqrt(tmp2);
取稀疏度
重复实验。seed = 97006855;
ss = RandStream('mt19937ar','Seed',seed);
RandStream.setGlobalStream(ss);
m = 512;
n = 1024;
A = randn(m, n);
u = sprandn(n, 1, 0.2);
b = A * u;
x0 = randn(n, 1);
[x, out] = BP_ALM(x0, A, b, opts);
k2 = out.itr + 1;
data3 = out.feavec(1:k2);
tmp = [x0,out.itervec(:,1:k2-1)] - u*ones(1,k2);
tmp2 = sum(tmp.*tmp);
data4 = sqrt(tmp2);
结果可视化分别展示约束违反度和距离真实解的距离随着迭代步的变化。fig = figure;
semilogy(0:k1-1, data1, '-*', 'Color',[0.2 0.1 0.99], 'LineWidth',2);
hold on
semilogy(0:k2-1, data3, '-.o','Color',[0.99 0.1 0.2], 'LineWidth',1.5);
legend('r = 0.1' ,'r = 0.2');
ylabel('$\|Ax^k - b\|_2$', 'fontsize', 14, 'interpreter', 'latex');
xlabel('迭代步');
print(fig, '-depsc','iter-alm.eps');
fig = figure;
semilogy(0:k1-1, data2, '-*', 'Color',[0.2 0.1 0.99], 'LineWidth',2);
hold on
semilogy(0:k2-1, data4, '-.o','Color',[0.99 0.1 0.2], 'LineWidth',1.5);
legend('r = 0.1' ,'r = 0.2');
ylabel('$\|x^k - x^*\|_2$', 'fontsize', 14, 'interpreter', 'latex');
xlabel('迭代步');
print(fig, '-depsc','fea-alm.eps');
结果分析对于基追踪问题,取固定的非负拉格朗日罚因子,可以保证其收敛性。上图展示了在固定罚因子
的情况下不同稀疏度
的收敛情况,分别表示约束违反度
、当前点与最优点的距离
随迭代的变化。 我们观察到两次实验中,增广拉格朗日函数法均达到收敛。参考页面模型利用内层循环为近似点梯度法的增广拉格朗日函数算法求解,算法见 基追踪问题的增广拉格朗日函数法解法。此页面的源代码请见: demo_alm.m。版权声明此页面为《最优化:建模、算法与理论》、《最优化计算方法》配套代码。 代码作者:文再文、刘浩洋、户将,代码整理与页面制作:杨昊桐。著作权所有 (C) 2020 文再文、刘浩洋、户将

题目是这样,一个子函数要求删除数组中所有的用户输入的值的元素比如原数组1223,输入2数组就要变成13我是这么写的,但是结果不对,老哥们帮我看看,急哭了π__πT.Tε(...
题目是这样,一个子函数要求删除数组中所有的用户输入的值的元素 比如原数组1 2 2 3,输入2
数组就要变成1 3
我是这么写的,但是结果不对,老哥们帮我看看,急哭了π__π T.T ε(┬┬_┬┬)3 ╥﹏╥ ┬_┬ (╥╯^╰╥)int bn(int x[100],int s){int i, n, a=0;printf("请输入要删除的数字");scanf_s("%d", &n);for (i=0;i<=s-1;){a = s;if (x[i] == n){
s = s - 1;for (; s-1>=i; i++){x[s-1] = x[s];}
}if (a == s)break;}for(i=0;i<s;i++){printf("%d", x[i]);}printf("%这组数字现在共%d个", s);printf("\n");return 0;}
展开
选择擅长的领域继续答题?
{@each tagList as item}
${item.tagName}
{@/each}
手机回答更方便,互动更有趣,下载APP

题目要示是:计算下式前N项和作为函数值返回。s=(1*3)/(2*2)+(3*5)/(4*4)+.......+(2*n-1)*(2*n+1)/((2*n)(2*n))例...
题目要示是:计算下式前N项和作为函数值返回。s=(1*3)/(2*2)+(3*5)/(4*4)+.......+(2*n-1)*(2*n+1)/((2*n)(2*n))例如,当N的值是10时,函数返回:9.612558.===============
下面是我写的程序========程序能正常运行,,但当N等于10时,返回的值是9.975000。。好郁闷啊#include "stdio.h"#include "math.h"float add(int n);void main(){
int n;float a;printf("please input n:\n");scanf("%d",&n);a=add(n);printf("the result is %f",a);}float add(int n){
float sum; int i;for(i=n,sum=0;i>0;i--)sum=sum+(float)(2*n-1)*(2*n+1)/((2*n)*(2*n));return sum;}
展开
选择擅长的领域继续答题?
{@each tagList as item}
${item.tagName}
{@/each}
手机回答更方便,互动更有趣,下载APP

我要回帖

更多关于 求解初值问题是求什么 的文章

 

随机推荐