PyTorch实战:手把手教你实现Fourier Neural Operator(附完整代码解析)

如何理解Fourier Neural Operator (FNO) 2022年Nvidia发表在arXiv上的的FourcastNet作为几乎是最早的一篇气象大模型的工作(之前Google Research的MetNet主要还是对于降水的预报)。除了Transformer的backbone之外,使用到了2021年发表在ICLR上的Fourier Neural Operator。为了更好的理解模型的理论基础,可以详细学习一下以及他的前期工作GNOFNO作者对这两篇文章的解析blog。 阅读详情

PyTorch实战:从零构建Fourier神经算子的完整指南

在科学计算和工程仿真领域,偏微分方程(PDE)求解一直是个计算密集型任务。传统数值方法虽然精确,但面对复杂场景时往往需要消耗大量计算资源。Fourier Neural Operator(FNO)通过将神经网络与傅里叶变换相结合,实现了比传统PDE求解器快1000倍的运算速度,同时保持相当的精度。本文将带你用PyTorch从零实现1D和2D版本的FNO,解决实际开发中的复数运算、维度转换等棘手问题。

1. FNO核心原理与架构设计

FNO的创新之处在于直接在傅里叶空间参数化积分核,避免了传统神经网络在物理空间中的低效计算。其核心数学表达式可以概括为:

v_{t+1}(x) = σ(W * v_t(x) + (K * v_t)(x))

其中K是在傅里叶空间定义的积分算子,W是局部线性变换。这种设计带来了三个关键优势:

  • 频域稀疏性:大多数PDE解在频域具有稀疏表示,只需保留少量低频模态
  • 参数共享:傅里叶基函数的全局性使得模型可以跨不同网格分辨率工作
  • 计算高效:利用FFT算法将O(N²)复杂度降为O(N log N)

FNO与传统PDE求解器的对比:

特性 传统数值方法 FNO
计算复杂度 O(N³) O(N log N)
网格依赖性 需要重新离散化 网格无关
训练成本 无需训练 需要训练数据
推理速度 慢 快3个数量级
泛化能力 特定问题定制 跨问题泛化

实际部署时,FNO通常包含以下几个关键组件:

  1. 提升网络(Lifting Network):将低维输入映射到高维表示空间
  2. 傅里叶层堆叠:4-6个交替的傅里叶积分算子和局部线性变换
  3. 投影网络(Projection Network):将高维特征映射回目标输出空间

2. 1D Fourier层的实现细节

让我们从基础的1D版本开始,逐步构建完整的FNO模型。核心组件SpectralConv1d的实现需要特别注意复数运算和维度对齐问题。

import torch
import torch.nn as tn
import torch.nn.functional as tnf

class SpectralConv1d(tn.Module):
    def __init__(self, in_channels, out_channels, modes1):
        super().__init__()
        self.in_channels = in_channels
        self.out_channels = out_channels
        self.modes1 = modes1  # 保留的傅里叶模态数
        
        # 复数权重初始化,scale保证训练稳定性
        self.scale = (1 / (in_channels * out_channels))
        self.weights = tn.Parameter(
            self.scale * torch.rand(in_channels, out_channels, modes1, 
                                  dtype=torch.cfloat))
    
    def compl_mul1d(self, input, weights):
        """复数矩阵乘法专用函数"""
        return torch.einsum("bix,iox->box", input, weights)
    
    def forward(self, x):
        batchsize = x.shape[0]
        
        #
传统求解器黑箱不可微问题的深度解析与FNO神经网络的解决方案 随着PINO、Wavelet Neural Operators等衍生技术的发展,FNO有望在2030年前成为流体力学、材料科学、地球物理等领域的底层基础设施,彻底重构科学发现与工程优化的范式。例如,在优化问题中需要计算目标函数对输入参数(如材料属性、边界条件)的导数时,传统方法需依赖有限差分近似,计算成本呈。在参数反演(如地质渗透率估计)、实时控制(如激光加工热场调控)等场景中,传统方法需反复调用求解器,计算成本呈指数级增长。例如,在渗透率反演问题中,FNO的梯度计算速度比传统方法快1000倍。 阅读详情

相关推荐

FNO实战:用Fourier Neural Operator快速求解偏微分方程(附Python代码)

本文详细介绍了Fourier Neural Operator在快速求解偏微分方程中的实战应用。通过Burgers方程案例,从数据生成、模型构建到训练评估,完整展示了FNO如何实现从参数到解的映射学习,相比传统数值方法实现毫秒级推理,大幅提升计算效率。

weixin_29096377的博客 365

物理信息神经网络(PINN)实战:从流体求解到可微分仿真

物理信息神经网络(PINN)是一种将偏微分方程(PDE)先验嵌入深度学习模型的前沿范式,其核心在于通过自动微分实现对守恒律、边界条件与动力学方程的结构化约束,而非简单拟合数据。相比传统黑箱模型,PINN具备外推性、守恒性与几何泛化能力,在计算流体力学(CFD)、多物理场仿真和参数反演中展现出高保真、低数据依赖的技术价值。典型应用场景包括毫秒级流场预测、未知物性参数反演、稀疏传感器数据重建,以及与ANSYS等商业求解器耦合构建可微分仿真链。本文聚焦PINN与Neural Operators在流体建模中的工程落

love android 434

物理信息机器学习:原理、实现与工程实践指南

在科学与工程计算领域,将物理定律与机器学习模型相结合,正成为解决复杂建模与仿真难题的关键范式。其核心原理在于,通过将已知的物理方程(如偏微分方程)作为约束,嵌入到神经网络的训练过程中,从而引导模型生成既符合数据又遵守物理规律的可信解。这一技术价值在于,它能有效克服纯数据驱动模型泛化能力弱、缺乏可解释性的局限,同时避免了传统数值模拟方法计算成本高昂的问题。其应用场景广泛,涵盖流体力学、材料科学、气象预报等领域的正向求解、参数反演与数据同化。具体实现时,自动微分技术是计算物理约束梯度的引擎,而损失函数中各项的平

weixin_30552811的博客 408

国产CAE与物理AI融合:技术栈、主流路线与PINN实践

计算机辅助工程(CAE)是工业产品研发中不可或缺的仿真工具,但传统求解方式常面临计算成本高、周期长等瓶颈。随着深度学习在科学计算领域的持续突破,物理AI(Physics-informed AI)正在为仿真行业带来新的思路:将物理规律与神经网络相结合,用数据驱动或物理约束的方式加速求解过程。这种范式转换不仅催生了神经算子、PINN等新型算法,也让国产CAE厂商看到了换道超车的机会。本文从工程实践视角,梳理物理AI时代的技术栈与开发环境,分析DeepONet、FNO、PINN及大模型在前处理中的应用,并通过一个

axfcjwkbi259888707的博客 437

VLA-2025-03:GR00T N1【骨架:Eagle-2;端到端双系统VLA:S2 VLM+S1 DiT+FM;数据:单/双臂+人形,机器人+人类+仿真+神经共592.9M帧/8375.7小时】

通用机器人需要多功能的躯体和智能的头脑。近年来,人形机器人的发展在构建人类世界中通用自主性的硬件平台方面展现出巨大潜力。一个基于海量多样化数据源训练的机器人基础模型,对于使机器人能够推理新情况、稳健应对现实世界的多变性以及快速学习新任务至关重要。为此,我们推出了GR00T N1,一个面向人形机器人的开放基础模型。GR00T N1是一个具有双系统架构的视觉‑语言‑动作(VLA)模型。视觉语言模块(系统2)通过视觉和语言指令来解读环境。随后的扩散Transformer模块(系统1)实时生成流畅的电机动作。

u013250861的博客 286

置顶必读(2) |《YOLOv8实战:从入门到深度优化》总目录导航 & 学习路线指南(持续更新中)

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 28万+

【信息科学与工程学】【数据科学】第一百八十八篇 线性/非线性泛函分析01

​ 普通数值函数 f:R→R​泛函⬇️最规矩的孩子:线性泛函(面积、加权求和)⬇️大多数自然界的现象:非线性泛函(曲线的能量、弧长)⬇️最光滑好算的:连续/可微泛函(可用欧拉-拉格朗日方程求极值的)⬇️刺头:不连续/奇异泛函(狄拉克 Delta,阶跃)弧长泛函​ — 变分法/几何最速降线泛函(时间泛函)​ — 变分法/经典力学动能-势能差(作用量)泛函​ — 拉格朗日力学Dirichlet能量泛函​ — PDE/位势论/调和函数线性积分泛函(Lebesgue空间上的有界线性泛函)

weixin_49199313的博客 195

【信息科学与工程学】【数据科学】第十八篇 数值分析 系列二 数值算法设计01

编号类型领域问题问题的数学分析及数值分析算法逐步推理思考的数学表达式参数列表及参数的边界范围及条件及常数关联知识1数值积分数值逼近计算定积分 I=∫ab​f(x)dx的近似值。数学分析:将积分区间等分,利用插值多项式近似被积函数,构造机械求积公式。数值分析:Newton-Cotes公式是等距节点的插值型求积公式。高阶公式(n≥8)因Cotes系数有正负,数值不稳定。偶阶公式(如Simpson)具有n+1次代数精度。为提高精度,常采用复化求积法(将区间细分后应用低阶公式)。

weixin_49199313的博客 158

深度学习在偏微分方程求解中的应用:傅里叶神经算子

傅里叶神经算子(FNO)是一种新兴的神经网络架构,专门设计用于处理和求解偏微分方程(PDEs)。PDEs广泛应用于物理学、工程学和金融学等领域,其在描述系统动态和稳态行为中起着核心作用。然而,传统的数值解法通常涉及复杂的手动特征工程和有限差分/有限元方法,它们在处理高维问题时会遇到计算效率和精度的双重挑战。FNO的出现,标志着深度学习技术在这一领域的突破性进展,它通过在频域中操作来捕获输入和输出之间的复杂映射关系,从而能够高效且准确地解决PDEs。

weixin_35755188的博客 3511

一文读懂AI大模型时代的RAG技术

RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合检索技术与生成模型的技术架构,旨在通过动态引入外部知识库增强大语言模型(LLM)的生成能力。其核心思想是通过检索系统从外部数据源(如企业知识库、实时文档等)获取相关信息,并将检索结果作为上下文输入生成模型,以提高生成答案的准确性、时效性和专业性

awei0916的专栏 2119

从零做出可发布的2D冒险游戏!Unity全流程实战指南:从资源搭建到打包发布,新手也能跟着做

项目配置→资源导入→核心模块开发→关卡设计→调试→打包发布;玩家控制→敌人AI→道具系统→UI系统→游戏管理器→音效系统;新手开发重点:先实现核心玩法(移动、跳跃、攻击),再补充UI、音效、存档等辅助功能;调试是关键:每实现一个功能就测试,避免最后一堆bug难以定位。从零做一款完整的2D冒险游戏,能快速提升你的Unity综合能力——不仅能掌握C#编程、2D物理、UI系统,还能理解游戏开发的完整流程。先做出基础版,再慢慢迭代优化,你会发现游戏开发并没有想象中那么难。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1176

Unreal5从入门到精通之如何实现移动端触屏滑动手势

随着移动设备的普及,越来越多的游戏和应用选择在移动平台上发布。Unreal Engine 5(UE5)作为一款强大的游戏引擎,提供了丰富的工具和功能,帮助开发者打造出色的移动体验。UE5不仅提升了图形质量,还大幅简化了开发流程,使得开发者能够更专注于游戏设计和用户体验。在移动游戏中,触屏滑动手势是用户与应用互动的主要方式之一。然而,许多开发者在实现这些功能时常常遇到困难。为了填补这一知识空白,本篇文章将详细介绍如何在UE5中实现移动端触屏滑动手势,帮助你从入门到精通,提升你的开发技能。

TxNet 1136

华为s110、s220、s310、s530、s620 配置ssh,配置web登录

在服务器端创建SSH用户。

送个祝福给小豪的博客 317

YOLOv11改进策略【模型轻量化】| 使用 MoblieOne 模块,引入结构重参数化,提高模型检测效率

本文记录的是基于MobileOne的YOLOv11骨干网络改进方法研究。MobileOne的基础模块通过重参数化,。在将其替换YOLOv11的骨干网络后,实现模型轻量化。

Limiiiing的博客 1424

使用 MATLAB/Simulink 构建一个 光伏-储能联合系统接入10kV配电网 的协同控制仿真模型

本教程详细介绍了基于Simulink的光伏-储能联合系统在配电网中的协同控制仿真方法。主要内容包括:系统结构设计(光伏阵列、储能电池、双向变流器等);建模流程(MPPT控制、BMS系统、PCS矢量控制);核心协同控制策略(功率平滑、削峰填谷、电压支撑的三层控制架构);仿真结果分析方法及性能评估指标。教程提供了从组件建模到系统集成的完整指导,并建议了模型预测控制、微网孤岛运行等进阶方向,帮助开发者掌握智能电网的关键仿真技术。通过该模型可实现可再生能源的高效利用与电网稳定运行的平衡。

amy_mhd的博客 217

LeetCode 热题 100 回顾

力扣最受刷题发烧友欢迎的 100 道题 LeetCode 热题 100 : 题目回顾、解题思路、复杂度分析、代码实现、验证算法

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

ADS基础教程16 - 存档和导入(workspace、cell、view)

选择workspace_Archive目录作为保存workspace归档的目录,点击打开进行目录选择,点击Finish保存目录。,选择cell_Archive目录作为保存cell归档的目录,点击打开进行目录选择,点击Finish保存目录。,选择view_Archive目录作为保存view归档的目录,点击打开进行目录选择,点击Finish保存目录。(2)在弹框中,可以选择点击Select将参考的条目添加进来,然后点击Next…(2)在弹框中,可以选择点击Select将参考的条目添加进来,然后点击Next…

XZ_ZC的博客 3703

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 从PagedAttention到RadixTree:图解vLLM和SGLang的显存管理黑科技
下一篇: Hive 2.3.9安装避坑指南:从MySQL驱动配置到元数据初始化全流程
java5
博客等级 码龄22年 85粉丝 2103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值