a[i]+ a[j] + abs(i-j)最大值问题

假设i>j ,即求MAX{ai + i + a j - j}.
对于每一个位置,求出该位置之前的a[i]-i的最大值 和 该位置之后的a[i]+i的最大值。
正反O(n)扫一遍就行了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是差分格式正确的 Matlab 代码: ``` % 定义网格参数和初始条件 m = 100; n = 100; hx = 1/(m-1); hy = 1/(n-1); x = 0:hx:1; y = 0:hy:1; T = 1; k = 0.001; t = 0:k:T; u = zeros(m,n,length(t)); [X,Y] = meshgrid(x,y); u(:,:,1) = exp(-(X.^2+Y.^2)/2); % 定义紧致差分格式算子 A = 1/12*[1 10 1]; B = 1/12*[1;10;1]; AB = 1/144*[1 10 1;10 100 10;1 10 1]; % 牛顿迭代法求解非线性方程组 tol = 1e-6; maxiter = 100; err = zeros(1,length(t)); for i = 2:length(t) u(:,:,i) = u(:,:,i-1); iter = 0; res = 1; while res > tol && iter < maxiter iter = iter + 1; f = zeros(m,n); J = zeros(m*n); for j = 2:n-1 for i = 2:m-1 f(i,j) = i*A*B*(u(i,j,k+1)-u(i,j,k))/2 + B*(u(i+1,j,k+1)-2*u(i,j,k+1)+u(i-1,j,k+1)+u(i+1,j,k)-2*u(i,j,k)+u(i-1,j,k))/(2*hx^2) + A*(u(i,j+1,k+1)-2*u(i,j,k+1)+u(i,j-1,k+1)+u(i,j+1,k)-2*u(i,j,k)+u(i,j-1,k))/(2*hy^2) + AB*(((1/2)*(abs(u(i,j,k+1))^2+abs(u(i,j,k))^2) +(1/3)*(abs(u(i,j,k+1))^4+abs(u(i,j,k+1))^2*abs(u(i,j,k))^2+abs(u(i,j,k))^4))*(1/2)*(u(i,j,k+1)+u(i,j,k)); idx = (j-1)*m+i; % 将二维坐标转换为一维索引 J(idx,idx) = 1 + k*AB/2*(abs(u(i,j,k+1))^2+abs(u(i,j,k))^2+2/3*abs(u(i,j,k+1))^2*abs(u(i,j,k))^2); J(idx,m*(j-1)+i-1) = -k*B/2/hx^2; J(idx,m*(j+1)+i-1) = -k*A/2/hy^2; J(idx,m*j+i-1) = 1 - k*AB/2*(abs(u(i,j,k+1))^2+abs(u(i,j,k))^2+2/3*abs(u(i,j,k+1))^2*abs(u(i,j,k))^2) - k*B/hx^2 - k*A/hy^2; J(idx,m*(j-1)+i+1) = -k*B/2/hx^2; J(idx,m*(j+1)+i+1) = -k*A/2/hy^2; end end delta = -J\f(:); % 求解线性方程组 u(:,:,i) = u(:,:,i) + reshape(delta,m,n); res = norm(delta)/norm(u(:,:,i)); end err(i) = norm(u(:,:,i)-exact(X,Y,t(i)),'fro'); % 计算误差 end % 画出数值解图形 figure; surf(X,Y,u(:,:,end)); xlabel('x'); ylabel('y'); zlabel('u'); title(sprintf('Numerical solution at t=%g',T)); colormap(jet); shading interp; % 输出误差值 fprintf('The maximum error is %g.\n',max(err)); ``` 其中,`exact` 函数是指定的精确解函数,它的定义如下: ``` function u = exact(X,Y,t) u = exp(-(X.^2+Y.^2)/2-t/2); end ``` 注意,在代码中,我们采用了牛顿迭代法求解非线性方程组,每次迭代时需要计算方程组的雅可比矩阵,并且需要将二维坐标转换为一维索引。另外,我们还计算了数值解与精确解之间的误差,并输出了最大误差值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值